gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:05:11 26 4
gpt4 key购买 nike

我有两个 JTrees,里面有一些模拟数据,我想要做的是能够接受每个“工作”(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] |
+------------------------------+------------------------------+

因此,假设我在“要运送的零件”jtree 的作业 A 中的盖子上有两个螺钉,而我在装运箱中的作业 A 中没有任何东西,当我将螺钉拖到装运箱时,它应该为 jobA 创建一个条目,为 A 部分创建一个条目并为组件创建一个条目,然后我希望它提示输入该组件的数量并从要运送的部件 jtree 中减去该数量。

因此,如果我有一份名为 1553-4 的工作,它有一个带四个螺丝的盖子,我将螺丝拖入装运箱,那么它应该在装运箱中输入“x 螺丝”,然后提示输入用户输入他们刚刚打包的螺钉数量,如果他们打包了两个螺钉,则 jtree 应该更改以反射(reflect)该作业剩余的 2 个螺钉。

我已经阅读了很多不同的拖放教程,也有一些示例,但我似乎无法理解。任何建议或帮助将不胜感激。

我知道我需要实现一个 TranferHandler,但我不确定具体如何实现,似乎有太多的接口(interface)“魔法”在起作用,我真的不理解它。

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

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 拖出的简洁拖放示例。

最佳答案

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

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

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

但一如既往,Swing tutorials是一个很好的起点。在你完成它们之后,你可能会想出一个更详细的问题(如果你还有任何问题,因为你的要求相当微不足道)

关于java - 如何实现从一个 JTree 到另一个 JTree 的智能拖放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com