Java自定义拖放-没有对TransferHandler的回调。
我想为JPanel实现自定义拖放功能
子类。我遵循标准DnD指南的准则:
Drag and Drop and Data Transfer
从表面上看,事情似乎很直截了当,但是当我实际上
试试看,我没有任何迹象表明正在发生任何DnD行为。在
事实上,我的TransferHandler中的任何方法都没有被调用。
所以,让我们回顾一下我所做的...
我制作了自己的Container类,该类声明了对JPanel的扩展:
public class DnDUnitPanel extends JPanel
{
...
}
我从此演示复制了ListTransferHandler:
Drop Demo
将类重命名为DndUnitTransferHandler,修剪掉的代码是
引用JList对象,并安装System.out.println()语句
那里的5种方法中的每一种。
然后,我实例化DnDUnitPanel的两个不同实例,如下所示:
DnDUnitPanel topPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// topPanel.setDragEnabled(true);
topPanel.setName("Top Panel");
topPanel.setTransferHandler(new DnDUnitTransferHandler());
DnDUnitPanel bottomPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// bottomPanel.setDragEnabled(true);
bottomPanel.setName("Bottom Panel");
bottomPanel.setTransferHandler(new DnDUnitTransferHandler());
(并且我还创建了一些JLabel实例,并将它们添加()到面板中
(未显示))。
当我尝试将JLabel从一个面板拖到另一个面板时,什么也没有发生。
因此,我返回并重新阅读此页面:
Transfer Handler
特别是关于setDragEnabled()的内容:
turns on drag support. (The default is false.) This method is
defined on each component that supports the drag gesture; the link
takes you to the documentation for JList.
JPanel没有setDragEnabled()方法。所以,我问自己,
这真的意味着:“支持拖动手势的组件”吗?
我首先认为这必须表示已声明要实现
MouseListener和/或MouseMotionListener。我将DnDUnitPanel修改为
声明它既实现又提供了所有方法。有
这样做,我可以看到mousePressed(),mouseClicked(),
mouseDragged()等被调用,但仍然没有
正在调用TransferHandler,但仍然没有拖动光标指示
某些东西被拖动或准备放下。
然后,我查看了JList本身的来源,并决定
“支持拖动手势”实际上只是表示具有
'dragEnabled'属性以及关联的getter和setter。
因此,我声明了该属性,并提供了getter和setter
通过直接从JList本身直接复制代码来实现DnDUnitPanel(思考
也许我不完全了解的是
isDragEnabled()并寻找一个真值以启动DnD行为。)
不幸的是,提供了这些信息(并且取消了对
DnDUnitPanel.setDragEnabled())也无效。
所以... TransferHandler永远不会被调用()。显然是
重要的地方在这里丢失了,但是我不知道那是什么。
我对接下来要尝试的东西一无所知。
有人看到这里缺少什么吗?
最佳答案
基本上,您需要一个数据源。
看看其他Stackoverflow question,here和here(对DnD的很好解释)