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 questionherehere(对DnD的很好解释)

07-26 07:37