JPanel 中的 Java 自定义拖放

Posted

技术标签:

【中文标题】JPanel 中的 Java 自定义拖放【英文标题】:Java Custom Drag and Drop in JPanel 【发布时间】:2012-06-11 00:43:25 【问题描述】:

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

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

Drag and Drop and Data Transfer

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

那么,让我们回顾一下我做了什么……

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

public class DnDUnitPanel extends JPanel

    ...

我从这个 Demo 中复制了 ListTransferHandler:

Drop Demo

将类重命名为 DndUnitTransferHandler,删掉代码 引用 JList 对象,并安装 System.out.println() statments 在那里的 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 DnDUnitPanel 通过直接从 JList 本身复制代码(思考 也许我不完全理解的东西正在调用 isDragEnabled() 并寻找一个真正的值来启动 DnD 行为。)

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

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

对于下一步该尝试什么,我束手无策。

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

【问题讨论】:

【参考方案1】:

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

看看其他*** question、here和here(对DnD很好的解释)

【讨论】:

我认为 DnD 技术的新手往往会遇到的主要问题是没有认识到您必须提供自己的 MouseListener 或 MouseMotionListener 才能开始拖动(对于自定义组件,它们本身不提供支持)。我发现dreamincode example 是最有用的。谢谢@Xeon 的回答。

以上是关于JPanel 中的 Java 自定义拖放的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中的网格中的单元格之间拖放自定义控件

iOS 11拖放自定义文件?

在 QListWidget 之间拖放自定义小部件项目

WPF拖放自定义类

动画拖放自定义 Delphi 组件

Java在列表中拖放图像