我有一个应用程序,其中包含一个支持DefaultTreeModel的JTree,它用于显示反映我服务器上文件系统一部分的文件层次结构(我将其称为我的客户端应用程序).我还有一个服务器应用程序,它提供我的客户端应用程序需要显示的数据(我将这称为我的服务器应用程序).我正在使用"懒惰加载子"方法,以便我只需要将文件加载到我的树中,如果用户对它们感兴趣的话.延迟加载方法:
treeWillExpand(TreeExpansionEvent evt)
DefaultTreeModel.insertNodeInto()
用于每个返回的数据文件.DefaultTreeModel.nodeStructureChanged()
.以上工作正常,懒惰加载孩子我没有任何问题.我的问题出现在新数据上传到服务器并且我想更新树不仅包括新数据,而且还要将扩展状态和选定节点设置为更新树之前的状态(以便用户因为有新的数据需要查看,所以不会在树上蠢蠢欲动.流程如下:
JTree.getExpandedDescendants()
JTree.getSelectionPath()
JTree.getExpandedDescendants()
调用枚举中的JTree.expandPath()
每个TreePath 返回的树路径枚举.我的问题是,无论我尝试什么,树的GUI都不会更新以反映扩展状态.我知道我对expandPath的调用正在发挥作用,因为我可以看到客户端发送的数据请求以及每次调用expandPath时服务器数据的响应.我还在另一个窗口中显示有关当前所选节点的信息,并显示正确选择的节点.但是,令我失望的是,GUI只显示根节点(已展开)和它的子节点(未展开)而不是之前的展开状态.
所以我的问题是:如何恢复JTree的扩展状态,以便在数据模型更新之前和之后GUI保持不变?
这些是我尝试过的一些事情:
equals()
,hashCode()
但这对我没有用.setExpandsSelectedPaths(true)
,nodeStructureChanged()
,JTree.invalidate()
这是我的SSCCE:
package tree.sscce;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.JButton;
import java.util.Enumeration;
import javax.swing.BoxLayout;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import …
Run Code Online (Sandbox Code Playgroud) 我用默认的 NetBeans 编辑器创建了一个表单并jTree
在上面放了一个。然后它以某种方式在其中创建了一堆元素,例如“颜色”、“运动”、“食物”。但它不在创建代码中。它来自哪里,我该如何编辑它...
即使我做了jTree1.removeAll();
所有事情仍然存在......并且没有我的代码来向jTree工作添加新项目。
private void test(java.awt.event.MouseEvent evt) {
//trying to remove all, but it does not remove anything
jTree1.removeAll();
//it does print it in debug meaning that this function is called
System.out.println("qwe");
//create the root node
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
//create the child nodes
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1");
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2");
//add the child nodes to the root node
root.add(child1);
root.add(child2);
//now how do I add it to the …
Run Code Online (Sandbox Code Playgroud) 我想修改此链接中给出的 Swing 示例中的标准 JTree ->动态树示例 应用程序的屏幕截图如下: DynamicTreeDemo
我想用这个结构来维护两棵树,它们都具有完全相同的结构。当单击鼠标折叠/展开时,我应该能够同时折叠和展开两者!
此外,当用户从任一树中选择一个节点时,另一棵树中的相应节点也应突出显示。
一棵树可能包含文件/文件夹作为节点,另一棵树可能有创建时间作为节点。
我可以在每个 DynamicTree 对象中仅使用一个 Jtree 对象来使其工作吗?(请参阅示例以了解这些对象是什么)有没有办法让 Jtree 只存储一个包含来自每棵树相应节点的数据的对象,但将这些数据显示在单独的树上?
目前,我正在使用两个 Jtree,可以通过将两个父级和两个子级作为 add 函数的输入,并将相应的子级添加到相应的父级来添加节点。
但是,在remove/expand/collapse 函数中,我需要从两棵树中移除/展开/折叠两个对应的节点。我该怎么做呢?
我是 java swing 的新手,但不是 java 编程的新手。所以请说明需要Jswing知识的部分。
提前致谢。