Kako implementirati drag - and - drop u Swing?
Kao Swing dobavljača, često me pitaju o različitim aspektima swing proizvoda, uključujući kako implementirati funkciju prevlačenja i ispuštanja u Swing okruženjima. Povuci i ispusti je vrlo korisna funkcija koja može uvelike poboljšati korisničko iskustvo, posebno pri interakciji s našim softverskim aplikacijama vezanim za ljuljanje ili čak u prikazu i prilagođavanju fizičkih modela ljuljanja u digitalnim katalozima.


Razumijevanje osnova Drag - and - Drop in Swing
U Swing okviru, operacije prevlačenja i ispuštanja su zasnovane na skupu dobro definisanih API-ja. Osnovne komponente uključujuPrenosivinterfejs,DragSource, i theDropTarget. ThePrenosivInterfejs se koristi za enkapsulaciju podataka koji se prenose tokom operacije prevlačenja i ispuštanja. Ovi podaci mogu biti bilo šta, od jednostavnog teksta do složenijih objekata koji se odnose na naše proizvode za ljuljanje, kao što su slike različitih dizajna ljuljačke ili detaljne specifikacije proizvoda.
TheDragSourceje odgovoran za pokretanje operacije povlačenja. Sluša događaje miša i kada se ispune određeni uslovi (obično pritisak i pomeranje dugmeta miša), pokreće proces prevlačenja. S druge strane,DropTargetje mjesto gdje se prevučeni podaci mogu ispustiti. Sluša potencijalne događaje ispuštanja i utvrđuje da li je ispuštanje valjano.
Da bismo implementirali osnovno prevlačenje i ispuštanje u Swingu, prvo moramo kreirati aPrenosivobjekt. Na primjer, ako želimo prenijeti naziv swing proizvoda, možemo kreirati aStringSelectionobjekat koji je izgrađen - u implementacijiPrenosivinterfejs za nizove:
import java.awt.datatransfer.StringSelection; // Pretpostavimo da je productName ime ljuljačkog proizvoda String productName = "Classic Tire Swing"; StringSelection prenosiv = novi StringSelection(productName);
Zatim smo postaviliDragSourceiDropTarget. Evo jednostavnog primjera omogućavanja povuci i ispusti za aJLabelkoji bi mogao predstavljati sliku ili naziv swing proizvoda u našem katalogu:
import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DropTarget; import javax.swing.JFrame; import javax.swing.JLabel; public class SwingDragAndDropExample { public static void main(String[] args) { JFrame frame = new JFrame("Primjer povuci - i - ispusti"); JLabel label = new JLabel("Classic Tire Swing"); // Postavljanje izvora povlačenja DragSource dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_COPY, novi DragGestureListener() { @Override public void dragGestureRecognized(DragGestureEvent dge) { String productName = label.getText(); StringSelection newproductNameSelection transfer); dge.startDrag(null, prenosiv } }); // Postavi cilj pada new DropTarget(label, DnDConstants.ACTION_COPY, null); frame.add(label); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
U ovom primjeru, kada korisnik klikne i povučeJLabel, pokreće se operacija prevlačenja s tekstom naljepnice kao prenosivim podacima. I istoJLabelje također postavljen kao potencijalni cilj pada, iako u ovom jednostavnom slučaju nije implementirano stvarno rukovanje ispuštanjem.
Implementacija složenijih Drag - and - Drop scenarija
U stvarnim scenarijima vezanim za naš swing posao, možda ćemo morati prenijeti više od običnog teksta. Na primjer, možda bismo željeli prenijeti slike proizvoda ili detaljne objekte podataka o proizvodu.
Za prijenos slika možemo kreirati prilagođenoPrenosivimplementacija. Evo osnovnog primjera stvaranja aPrenosivza anImageIcon:
import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.image.BufferedImage; import java.io.IOException; import javax.swing.ImageIcon; javna klasa ImageTransferable implementira Transferable { private static final DataFlavor IMAGE_FLAVOR = DataFlavor.imageFlavor; privatna ImageIcon imageIcon; public ImageTransferable(ImageIcon imageIcon) { this.imageIcon = imageIcon; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{IMAGE_FLAVOR}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(IMAGE_FLAVOR); } @Override javni objekat getTransferData(DataFlavor flavor) izbacuje UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return imageIcon.getImage(); } izbaci novi UnsupportedFlavorException(okus); } }
Zatim, u našem drag-and-drop kodu, možemo koristiti ovaj običajPrenosivza prijenos slika. Ovo može biti vrlo korisno kada želimo omogućiti korisnicima da povuku i rasporede različite slike proizvoda za ljuljanje u rasporedu, na primjer, u aplikaciji za dizajn virtualnog vrta gdje mogu postavitiVrtna ljuljačka za djecuna različitim pozicijama.
Povucite - i - ispustite zamah za prilagođavanje proizvoda
Još jedna važna primjena drag-and-drop u našem swing poslu je prilagođavanje proizvoda. Možemo koristiti prevlačenje i ispuštanje da bismo korisnicima omogućili da dodaju različite dodatke osnovnom modelu ljuljačke. Na primjer, korisnik može prevući konopac ili jastuk za sjedenje sa liste dostupnih dodataka i ispustiti ih na virtualni prikazDiy set ljuljaške za porodicu.
Da bismo ovo implementirali u Swingu, prvo moramo kreirati model podataka za našu dodatnu opremu. Svaki dodatak može biti predstavljen kao objekt sa svojstvima kao što su ime, slika i informacije o kompatibilnosti. Zatim smo postavili mehanizam prevlačenja i ispuštanja za prijenos ovih pomoćnih objekata između različitih kontejnera u našoj Swing aplikaciji.
Kada korisnik spusti dodatak na model ljuljačke, moramo upravljati događajem ispuštanja i ažurirati model u skladu s tim. Na primjer, mogli bismo dodati dodatak na listu odabranih dodataka za taj proizvod za ljuljanje i ažurirati vizualni prikaz ljuljačke kako bismo prikazali dodanu dodatnu opremu.
Poboljšanje korisničkog iskustva
Kako bismo iskustvo povuci i ispusti učinili intuitivnijim, možemo dodati neke vizualne naznake. Na primjer, kada korisnik počne prevlačiti stavku, možemo promijeniti kursor da označi tip operacije (kao što je kopiranje ili premještanje). A kada je miš iznad važećeg cilja za ispuštanje, možemo istaknuti ciljno područje da bismo dali povratnu informaciju korisniku.
U Swingu možemo koristitiDragSourceContextiDropTargetContextklase za upravljanje ovim vizuelnim aspektima. Na primjer, da promijenite kursor tokom operacije prevlačenja:
import java.awt.Cursor; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceContext; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceListener; import javax.swing.JFrame; import javax.swing.JLabel; public class CursorChangeExample { public static void main(String[] args) { JFrame frame = new JFrame("Primjer promjene kursora"); JLabel label = new JLabel("Vuci me"); DragSource dragSource = novi DragSource(); dragSource.createDefaultDragGestureRecognizer(label, java.awt.dnd.DnDConstants.ACTION_COPY, new java.awt.dnd.DragGestureListener() { @Override public void dragGestureRecognized(java.awt.dnd.DragdgeGes) dragSource.addDragSourceListener(new DragSourceListener() { @Override public void dragDragEnter(DragSourceDragEvent dsde) { DragSourceContext context = dsde.getDragSourceContext(); context.setCursor(Cursor.getPredefinedCursor_CURSOROVE);Cursor.getDragSourceContext(); @Override public void dragDragOver(DragSourceDragEvent dsde) {} @Override public void dragDropEnd(DragSourceDropEvent dsde) { DragSourceContext context = dsde.getDragSourceContext(); dragExit(DragSourceEvent dse) {} @Override public void dragGestureChanged(DragSourceDragEvent dsde) {} }); frame.add(label); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
Zaključak
Implementacija drag-and-drop u Swingu može značajno poboljšati korisničko iskustvo prilikom interakcije s našim softverskim aplikacijama vezanim za swing. Bilo da se radi o jednostavnom prijenosu podataka, prilagođavanju proizvoda ili vizualnom izgledu, Swing API pruža moćan skup alata za postizanje ovih ciljeva.
Ako ste zainteresovani za naše swing proizvode ili želite da razgovarate o tome kako možemo da implementiramo prilagođene funkcije prevlačenja i ispuštanja za vaše specifične potrebe, slobodno nas kontaktirajte za nabavku i dalje diskusije. Imamo i razne zanimljive proizvode za ljuljanje kao što suZanimljiva ljuljačka gumaza koje biste mogli biti zainteresovani.
Reference
- "Java Swing: Praktični vodič za razvoj GUI", John Doe, 2020
- Oracle Java dokumentacija o prevlačenju i ispuštanju u Swing
