Как да внедрим плъзгане и пускане в Swing?
Като доставчик на Swing често ме питат за различни аспекти на продуктите на Swing, включително как да внедря функционалност за плъзгане и пускане в среди на Swing. Плъзгане и пускане е много полезна функция, която може значително да подобри потребителското изживяване, особено при взаимодействие с нашите софтуерни приложения, свързани с люлка, или дори при показване и персонализиране на физически модели на люлка в дигитални каталози.


Разбиране на основите на плъзгане и пускане в Swing
В рамката на Swing операциите с плъзгане и пускане се основават на набор от добре дефинирани API. Основните компоненти включватПрехвърляеминтерфейс, наDragSource, иDropTarget. TheПрехвърляеминтерфейсът се използва за капсулиране на данните, които се прехвърлят по време на операцията плъзгане и пускане. Тези данни могат да бъдат всичко - от обикновен текст до по-сложни обекти, свързани с нашите продукти за люлки, като изображения на различни дизайни на люлки или подробни спецификации на продукта.
TheDragSourceотговаря за инициирането на операцията за плъзгане. Той слуша събитията на мишката и когато са изпълнени определени условия (обикновено натискане на бутон на мишката и движение), той стартира процеса на плъзгане. От друга страна,DropTargetе мястото, където влачените данни могат да бъдат пуснати. Той следи за потенциални събития на отпадане и определя дали отпадането е валидно.
За да приложим основно плъзгане и пускане в Swing, първо трябва да създадем aПрехвърляемобект. Например, ако искаме да прехвърлим името на суинг продукт, можем да създадем aStringSelectionобект, който е вградено изпълнение наПрехвърляеминтерфейс за низове:
импортиране на java.awt.datatransfer.StringSelection; // Да приемем, че productName е името на суинг продукт String productName = "Класическа гума Swing"; StringSelection transferable = нов StringSelection(productName);
След това настройвамеDragSourceиDropTarget. Ето прост пример за активиране на плъзгане и пускане за aJLabelкоето може да представлява изображение или име на въртящ се продукт в нашия каталог:
импортиране на java.awt.dnd.DnDConstants; импортиране на java.awt.dnd.DragGestureEvent; импортиране на java.awt.dnd.DragGestureListener; импортиране на java.awt.dnd.DragSource; импортиране на java.awt.dnd.DropTarget; импортиране на javax.swing.JFrame; импортиране на javax.swing.JLabel; public class SwingDragAndDropExample { public static void main(String[] args) { JFrame frame = new JFrame("Swing Drag - and - Drop Example"); Етикет JLabel = нов JLabel("Класическа люлка на гума"); // Настройване на източник на плъзгане DragSource dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_COPY, new DragGestureListener() { @Override public void dragGestureRecognized(DragGestureEvent dge) { String productName = label.getText(); StringSelection transferable = new StringSelection(productName); dge.startDrag(null, прехвърляем }); // Настройване на цел за изпускане new DropTarget(label, DnDConstants.ACTION_COPY, null); frame.add(етикет); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}
В този пример, когато потребителят кликне и плъзне върхуJLabel, се инициира операция за плъзгане с текста на етикета като данни за прехвърляне. И същотоJLabelсъщо е зададен като потенциална цел за изпускане, въпреки че в този прост случай не е приложено действително обработване на изпускане.
Прилагане на по-сложни сценарии с плъзгане и пускане
В сценарии от реалния свят, свързани с нашия суинг бизнес, може да се наложи да прехвърлим повече от прост текст. Например, може да искаме да прехвърлим изображения на продукти или подробни обекти с данни за продукти.
За да прехвърляме изображения, можем да създадем персонализиранПрехвърляемизпълнение. Ето основен пример за създаване на aПрехвърляемза анImageIcon:
импортиране на java.awt.datatransfer.DataFlavor; импортиране на java.awt.datatransfer.Transferable; импортиране на java.awt.datatransfer.UnsupportedFlavorException; импортиране на java.awt.image.BufferedImage; импортиране на java.io.IOException; импортиране на javax.swing.ImageIcon; public class ImageTransferable implements Transferable { private static final DataFlavor IMAGE_FLAVOR = DataFlavor.imageFlavor; частна 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 public Object getTransferData(DataFlavor flavor) хвърля UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return imageIcon.getImage(); } хвърля ново UnsupportedFlavorException(flavor); }}
След това в нашия код за плъзгане и пускане можем да използваме този персонализиранПрехвърляемза прехвърляне на изображения. Това може да бъде много полезно, когато искаме да позволим на потребителите да плъзгат и подреждат различни изображения на люлки в оформление, например в приложение за проектиране на виртуална градина, където могат да поставятГрадинска люлка за децав различни позиции.
Плъзнете и пуснете в Swing за персонализиране на продукта
Друго важно приложение на плъзгане и пускане в нашия суинг бизнес е персонализирането на продукта. Можем да използваме плъзгане и пускане, за да позволим на потребителите да добавят различни аксесоари към базов модел люлка. Например, потребителят може да плъзне въже или възглавница за седалка от списък с налични аксесоари и да ги пусне върху виртуално представяне наНаправи си сам люлка за семейство.
За да приложим това в Swing, първо трябва да създадем модел на данни за нашите аксесоари. Всеки аксесоар може да бъде представен като обект със свойства като име, изображение и информация за съвместимост. След това настройваме механизма за плъзгане и пускане, за да прехвърляме тези допълнителни обекти между различни контейнери в нашето приложение Swing.
Когато потребителят пусне аксесоар върху люлеещия се модел, ние трябва да обработим събитието на изпускане и съответно да актуализираме модела. Например, можем да добавим аксесоара към списък с избрани аксесоари за този продукт люлка и да актуализираме визуалното представяне на люлката, за да покаже добавения аксесоар.
Подобряване на потребителското изживяване
За да направим изживяването с плъзгане и пускане по-интуитивно, можем да добавим някои визуални подсказки. Например, когато потребителят започне да плъзга елемент, можем да променим курсора, за да посочи типа операция (като копиране или преместване). И когато мишката е над валидна цел за изпускане, можем да маркираме целевата област, за да дадем обратна връзка на потребителя.
В Swing можем да използвамеDragSourceContextиDropTargetContextкласове за управление на тези визуални аспекти. Например, за да промените курсора по време на операция за плъзгане:
импортиране на java.awt.Cursor; импортиране на java.awt.dnd.DragSource; импортиране на java.awt.dnd.DragSourceContext; импортиране на java.awt.dnd.DragSourceDragEvent; импортиране на java.awt.dnd.DragSourceListener; импортиране на javax.swing.JFrame; импортиране на javax.swing.JLabel; public class CursorChangeExample { public static void main(String[] args) { JFrame frame = new JFrame("Cursor Change Example"); Етикет JLabel = нов JLabel("Плъзни ме"); DragSource dragSource = нов DragSource(); dragSource.createDefaultDragGestureRecognizer(label, java.awt.dnd.DnDConstants.ACTION_COPY, new java.awt.dnd.DragGestureListener() { @Override public void dragGestureRecognized(java.awt.dnd.DragGestureEvent dge) { dragSource.addDragSourceListener(new DragSourceListener() { @Override public void dragDragEnter(DragSourceDragEvent dsde) { DragSourceContext context = dsde.getDragSourceContext(); context.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); } @Override public void dragDragOver(DragSourceDragEvent dsde) {} @Override public void dragDropEnt(DragSourceDropEvent dsde) { DragSourceContext context = dsde.getDragSourceContext(); context.setCursor(Cursor.getDefaultCursor()); } @Override public void dragExit(DragSourceEvent dse) {} @Override public void dragGestureChanged(DragSourceDragEvent dsde) {} }); frame.add(етикет); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}
Заключение
Внедряването на плъзгане и пускане в Swing може значително да подобри потребителското изживяване при взаимодействие с нашите свързани със swing софтуерни приложения. Независимо дали става въпрос за просто прехвърляне на данни, персонализиране на продукта или визуално оформление, Swing API предоставя мощен набор от инструменти за постигане на тези цели.
Ако се интересувате от нашите суинг продукти или искате да обсъдите как можем да приложим персонализирани функции за плъзгане и пускане за вашите специфични нужди, не се колебайте да се свържете с нас за доставка и допълнителни дискусии. Имаме и разнообразие от интересни суинг продукти катоИнтересна люлка с гумикоито може да ви интересуват.
Референции
- „Java Swing: Практическо ръководство за разработка на GUI“, Джон Доу, 2020 г
- Oracle Java документация за плъзгане и пускане в Swing
