JPanel中的Java自定义拖放

时间:2012-06-06 23:28:03

标签: java swing drag-and-drop jpanel

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 DnDUnitPanel只是直接从JList本身复制代码(思考 也许我不完全理解的是打电话 isDragEnabled()并寻找一个真值来启动DnD行为。)

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

所以...... TransferHandler永远不会被调用()。有点儿 这里缺少重要的,但我没看到那可能是什么。

对于接下来要尝试的事情,我已经走到了尽头。

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

1 个答案:

答案 0 :(得分:11)

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

查看其他Stackoverflow questionherehere(对DnD的一个很好的解释)