- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个 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/
我在这里有一个我想要做的事情的例子:http://jsbin.com/OwoYAlEQ/1/edit 这是我的 HTML: person one person two person three per
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在我的 Web 应用程序中使用 Ajax ControlToolkit 中的 ModalPopupExtender。我将其 Drag 属性设置为 true,但是当我拖动弹出面板并将其放到新位置时,它
所以,基于this answer ,我有一组可以拖放并卡入到位的 div。唯一的问题是,可拖动的 div 具有不同的高度,我需要它们始终捕捉到目标的底部,而不是顶部。 您可以在this JsFiddl
我一直在使用 Bea 的解决方案 here一段时间后发现它非常有帮助。现在我遇到的问题是,当我将项目拖放到另一个 ListView 控件中或拖放到另一个 ListView 控件中,并且我想在拖动“期间
我试图在使用 QTreeWidget.setItemWidget() 重新父级(拖放)后将小部件放入 QTreeWidgetItem 但是,如果编译以下代码,结果是 QTreeWidgetItem 内
这是场景,我使用的是prototype和scriptaculous,但我相信jquery也会有同样的问题。我在相对定位的 div 中有一个可拖动图像的列表。问题是我无法将图像拖出父 div...好吧.
我正在使用一个普通(Bootstrap)表,我想在其中包含可排序的行。我正在使用 Angular CDK (DragDropModule) 来实现排序/排序。但是,当拖动行时,它会扭曲宽度,因为 cd
我正在尝试在我的 UICollectionView 中实现拖放机制,这与在快捷方式应用程序中重新排序快捷方式的组件非常相似。 截至目前,行为是当您开始拖动时,会留下一个透明的单元格 View ,而另一
我有以下 Jquery UI 拖放 jsfiddle https://jsfiddle.net/zoojsfiddle/ud96jdcp/ 具有
我希望创建一个基于网络的“公告板”,可以这么说,用户可以在其中创建/删除/拖放“图钉”,而不允许重叠“图钉”。 这是一个图表,应该有助于说明我正在尝试创建的内容: 'pins' 可能已创建双击;他们会
我是一名优秀的程序员,十分优秀!