9

Java 自定义拖放 - 没有对 TransferHandler 的回调。

我想为 JPanel 子类实现自定义拖放功能。我遵循标准 DnD 教程的指导方针:

拖放和数据传输

从表面上看,事情似乎很简单,但是当我真正尝试它时,我没有得到任何 DnD 行为正在发生的迹象。事实上,我的 TransferHandler 中没有一个方法被调用。

所以,让我们回顾一下我做了什么......

我创建了自己的 Container 类,它声明自己扩展 JPanel:

public class DnDUnitPanel extends JPanel
{
    ...
}

我从这个 Demo 复制了 ListTransferHandler:

掉落演示

将该类重命名为 DndUnitTransferHandler,删除引用 JList 对象的代码,并在其中的 5 个方法中的每一个上安装 System.out.println() 语句。

然后我实例化两个不同的 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 本身的源代码,并确定“支持拖动手势”实际上只是意味着具有关联 getter 和 setter 的“dragEnabled”属性的东西。

因此,我通过直接从 JList 本身复制代码来声明该属性并在 DnDUnitPanel 上提供 getter 和 setter(想可能我不完全理解的是调用 isDragEnabled() 并寻找一个真正的值来启动 DnD 行为。)

不幸的是,提供这些(并取消注释上面对 DnDUnitPanel.setDragEnabled() 的调用)也没有效果。

所以...... TransferHandler 永远不会被调用()。显然,这里缺少一些重要的东西,但我没有看到可能是什么。

对于下一步该尝试什么,我陷入了死胡同。

有人看到这里缺少什么吗?

4

1 回答 1

11

基本上你需要一个数据源。

看看另一个Stackoverflow 问题这里这里(对 DnD 的一个很好的解释)

于 2012-06-07T00:01:58.123 回答