如何实现从一个JTree到另一个JTree的智能拖放?

dav*_*nes 5 java swing drag-and-drop jtree

我有两个JTree,其中包含一些模拟数据,我要做的是能够获取每个'Job'(15663-1,15663-2等)并为每个创建一个节点,其节点为它下面的每个部分以及连接到它下面的每个部分的组件.在两棵树中,像这样:

+------------------------------+------------------------------+
| PARTS TO BE SHIPPED          | SHIPPING BOX                 |
+------------------------------+------------------------------+
|[JOB]                         |[JOB]                         |
|+------[part]                 |+------[part]                | 
|        +------[component]    |        +------[component]    |
|        +------[component]    |        +------[component]    |
|+------[part]                 |+------[part]                 |
|        +------[component]    |        +------[component]    |
|[JOB]                         |[JOB]                         |
|+------[part]                 |+------[part]                 |
|        +------[component]    |        +------[component]    |
|        +------[component]    |        +------[component]    |
|+------[part]                 |+------[part]                 |
|        +------[component]    |        +------[component]    |
+------------------------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)

因此,假设我在"待装运的零件"jtree的工作A中有两个螺丝,我在装运箱中没有任何东西,当我将螺丝拖到装运箱时它应该制作一个jobA的条目,为A部分创建条目并为组件创建条目,然后我希望它提示该组件的数量,并从要运送的部件中减去该数量jtree.

因此,如果我有一个名为1553-4的工作,它有一个带有四个螺丝的盖子,我将螺丝拖入包装箱,那么它应该在装运箱中输入一个条目,"x螺丝"然后提示用户输入他们刚刚打包的螺丝数量,如果他们打包两个螺丝,那么jtree应该改变以反映该工作剩余的2个螺丝.

我已经阅读了一些不同的拖放教程,我有一些例子,但我似乎无法得到它.任何建议或帮助将不胜感激.

我知道我需要实现一个TranferHandler,但我不确定究竟是怎样的,似乎有太多的界面"魔法"正在进行而且我真的不理解它.

这就是我所拥有的,我理解制作节点等等,这就是我所拥有的:

package com.protocase.examples;


import java.awt.Dimension;
import java.awt.HeadlessException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;

/**
 * @author DavidH
 */
public class JTreeExample {
    public static void main(String[] args) {
        addTreesAndDisplay();

    }

    private static void addTreesAndDisplay() throws HeadlessException {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();


        JTree tree = new JTree(getTreeModel());
        tree.setDragEnabled(true);
        tree.setPreferredSize(new Dimension(200,400));
        JScrollPane scroll = new JScrollPane();
        scroll.setViewportView(tree);
        panel.add(scroll);


        JTree secondTree = new JTree(getTreeModel());
        secondTree.setPreferredSize(new Dimension(200,400));
        secondTree.setDragEnabled(true);
        JScrollPane secondScroll = new JScrollPane();
        secondScroll.setViewportView(secondTree);
        panel.add(secondScroll);


        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static DefaultTreeModel getTreeModel() {
        MutableTreeNode root =  new DefaultMutableTreeNode("15663-1");
        DefaultMutableTreeNode cover = new DefaultMutableTreeNode("Cover");
        DefaultMutableTreeNode base = new DefaultMutableTreeNode("Base");
        root.insert(cover, 0);
        root.insert(base, 0);
        cover.insert(new DefaultMutableTreeNode("2x PEMS"), 0);
        cover.insert(new DefaultMutableTreeNode("2x SCREWS"), 0);
        base.insert(new DefaultMutableTreeNode("4x SCREWS"), 0);
        base.insert(new DefaultMutableTreeNode("4x HANDLES"), 0);
        DefaultTreeModel model = new DefaultTreeModel(root);
        return model;
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是想要一个简洁的拖放示例拖动到JTree并从JTree拖动.

Rob*_*bin 3

根据我自己的经验,用我自己的话对 Swing 中的拖放进行了非常简短、简单的介绍(主要是 JDK1.5 中的拖放,因此可能已经存在新功能)。

拖放操作分为两个部分。首先是来自源组件的拖动。TransferHandler源组件的会创建一个Transferable,它是用于在拖放操作中交换的数据的容器。根据数据的不同,数据可能有不同的表示形式(称为DataFlavors)。例如,如果您将 URL 拖放到文本编辑器中,它很可能会将该 URL 添加到当前文档中。但如果您将其放到网络浏览器上,您希望它打开该 URL。因此,第一个只对纯文本感兴趣,第二个可能对更复杂的对象感兴趣。

第二部分是掉落。首先判断当前位置是否是一个好的投放目标。由目标组件的传输处理程序决定是否接受放置。Transferable通常,这是通过询问Transferable特定组件的数据来检查它是否可以处理 中包含的数据来实现的DataFlavor(注意:Flavor必须知道 是源组件和目标组件)。当它接受放下并且用户释放鼠标时,它可以继续处理 中的数据Transferable,并希望用它做一些有用的事情。

但与往常一样,Swing 教程是一个非常好的起点。在您完成这些之后,您可能会提出一个更详细的问题(如果您仍然有任何问题,因为您的要求相当微不足道)