我有两个JTree,里面有一些模拟数据,我想要做的是能够把每个'Job'(15663-1,15663-2等)和每个节点做成一个节点节点下面的每个部分以及附着在其下面的每个部分的组件。在两棵树,就像这样:如何实现从一个JTree到另一个JTree的智能拖放?
+------------------------------+------------------------------+
| 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] |
+------------------------------+------------------------------+
成,假定我在工作中的一个盖子两个螺丝“的部件被运” JTree的,我没有在包装箱有什么的职吧,当我将螺丝拖到装运箱时,它应该为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;
}
}
我只是在寻找一个简洁的拖放例如拖动到一个JTree和拖动一个JTree。
这是一个很好的解释。我知道我需要扩展TransferHandler,但是我需要扩展DataFlavor吗?所以我需要在我的源列表上扩展Transfer Handler,并让它知道如何将它打包到一个可转换的版本中(这是一个拥有对象并扩展Transferable的类),然后为目的地编写第二个传输处理程序除非第一个传输处理程序知道如何做到这一点)? Dataflavors在哪里进来? – davidahines 2012-04-03 20:47:36
DataFlavor只是一种方法,用于指示'Transferable'(用于发送方)中可用的'种类'数据,以及接收方请求特定类型的数据。可以把它想像成一种类似于图书馆书籍的标签,在那里你可以说“给我神秘书”与“给我浪漫的东西” – Robin 2012-04-03 21:29:54
谢谢,我将会看看这些教程。 – davidahines 2012-04-03 21:55:33