JPanel中的Java自定义拖放

use*_*004 9 java swing drag-and-drop jpanel

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

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

拖放和数据传输

从表面上看,事情似乎非常明确,但是当我真正尝试它时,我没有表明任何DnD行为正在发生.实际上,我的TransferHandler中没有一个方法被调用.

所以,让我们回顾一下我的所作所为......

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

public class DnDUnitPanel extends JPanel
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我从这个Demo中复制了ListTransferHandler:

删除演示

将类重命名为DndUnitTransferHandler,修剪掉引用JList对象的代码,并在其中的每个方法上安装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());
Run Code Online (Sandbox Code Playgroud)

(我还创建了一些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.
Run Code Online (Sandbox Code Playgroud)

JPanel没有setDragEnabled()方法.所以,我问自己,这到底意味着什么:"支持拖动手势的组件"?

我首先想到这必须意味着声明实现MouseListener和/或MouseMotionListener的东西.我修改了DnDUnitPanel以声明它实现了两者并提供了所有方法.完成后,我可以看到mousePressed(),mouseClicked(),mouseDragged()等被调用,但TransferHandler中的任何内容都没有被调用,仍然没有拖动光标指示某些东西被拖动或准备好了下降.

然后我查看了JList本身的源代码并决定"支持拖动手势"实际上只是意味着具有"dragEnabled"属性以及相关的getter和setter的东西.

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

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

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

接下来要尝试什么,我已经走到了尽头.

有谁看到这里缺少什么?

Xeo*_*eon 11

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

看看其他Stackoverflow问题,这里这里(DnD的一个很好的解释)