【发布时间】:2014-12-02 08:51:01
【问题描述】:
好的,我的设置如下。我有一个使用 javax.swing 作为 ui 的 java 1.7 项目。这是我在以下教程之外的第一个项目,对于那些熟悉桌面的人来说,它是一个主动跟踪器。我有一个扩展 JPanel(并实现 Comparable)的类,因此我可以动态添加它并为每个类记录不同的数据。
面板被添加到布局中,其 y 位置取决于已有面板的数量。它们也被添加到 ArrayList 以按顺序对其进行排序。 该列表可以按类的属性之一进行排序。
我现在遇到的是,我希望能够手动拖放它们以更改布局和 ArrayList 中的顺序。加上一个注释,我不能只删除并重新添加一个,因为我会丢失保存在类中的值。
为此,我制作了一个需要执行以下操作的 JButton:
- 只要在按钮上按下鼠标,就需要用鼠标拖动它所属的面板。
- 释放鼠标后,它需要检查其位置,并在必要时前往该位置。
我尝试了一些拖放教程,但似乎找不到可以调整为我想要的内容。
Edit1:这是我尝试过的。
MouseListener listener = new DragMouseAdapter();
dragButton.addMouseListener(listener);
dragButton.setTransferHandler(new TransferHandler("text"));
然后
class DragMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent) e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.COPY);
// TODO make it a swap location drag and drop
}
}
这是来自一个教程,它成功地改变了文本,但这根本不是我想要的,我不知道如何改变它来做我想要的。
Edit2: This tutorial 描述了我想要做什么,但它不起作用。它给出了以下错误:
Step 1 of 7: Mouse pressed. Going to export our RandomDragAndDropPanel so that it is draggable.
Step 2 of 7: Returning the acceptable TransferHandler action. Our RandomDragAndDropPanel accepts Copy only.
Step 3 of 7: Casting the RandomDragAndDropPanel as Transferable. The Transferable RandomDragAndDropPanel will be queried for acceptable DataFlavors as it enters drop targets, as well as eventually present the target with the Object it transfers.
Step 4 of 7: Querying for acceptable DataFlavors to determine what is available. Our example only supports our custom RandomDragAndDropPanel DataFlavor.
Problem lazy loading: RandomDragAndDropPanel
java.lang.ClassNotFoundException: RandomDragAndDropPanel
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.awt.datatransfer.DataFlavor.tryToLoadClass(Unknown Source)
at java.awt.datatransfer.DataFlavor.initialize(Unknown Source)
at java.awt.datatransfer.DataFlavor.<init>(Unknown Source)
at DnD.DragAndDropPanelsDemo.getDragAndDropPanelDataFlavor(DragAndDropPanelsDemo.java:197)
at DnD.RandomDragAndDropPanel.getTransferDataFlavors(DragAndDropPanelsDemo.java:392)
at sun.awt.datatransfer.DataTransferer.getFormatsForTransferable(Unknown Source)
at sun.awt.dnd.SunDragSourceContextPeer.startDrag(Unknown Source)
at java.awt.dnd.DragSource.startDrag(Unknown Source)
at java.awt.dnd.DragSource.startDrag(Unknown Source)
at java.awt.dnd.DragGestureEvent.startDrag(Unknown Source)
at javax.swing.TransferHandler$DragHandler.dragGestureRecognized(Unknown Source)
at java.awt.dnd.DragGestureRecognizer.fireDragGestureRecognized(Unknown Source)
at javax.swing.TransferHandler$SwingDragGestureRecognizer.gestured(Unknown Source)
at javax.swing.TransferHandler.exportAsDrag(Unknown Source)
at DnD.DraggableMouseListener.mousePressed(DragAndDropPanelsDemo.java:456)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
【问题讨论】:
-
拜托,您能否发布您的尝试,以便我们帮助您找出问题所在?
-
我会编辑它,但问题主要不是我的代码不起作用,而是我不知道代码应该是什么。
标签: java swing drag-and-drop