Java自定义拖放 - 没有对TransferHandler的回调。
我想为JPanel实现自定义拖放功能 子类。我遵循标准DnD教程的指导原则:
Drag and Drop and Data Transfer
从表面上看,事情看起来非常明确,但实际上却是如此 尝试一下,我没有迹象表明任何DnD行为正在发生。在 事实上,我的TransferHandler中没有任何方法被调用。
所以,让我们回顾一下我的所作所为......
我创建了自己的Container类,声明自己扩展JPanel:
public class DnDUnitPanel extends JPanel
{
...
}
我从此演示中复制了ListTransferHandler:
将该类重命名为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从一个面板拖到另一个面板时,没有任何反应。 所以我回去重读了这个页面:
特别是关于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 DnDUnitPanel只是直接从JList本身复制代码(思考 也许我不完全理解的是打电话 isDragEnabled()并寻找一个真值来启动DnD行为。)
不幸的是,提供这些(并取消注释上面的调用 DnDUnitPanel.setDragEnabled())也没有效果。
所以...... TransferHandler永远不会被调用()。有点儿 这里缺少重要的,但我没看到那可能是什么。
对于接下来要尝试的事情,我已经走到了尽头。
有人看到这里缺少什么吗?