标签: defaulttreemodel

使用延迟加载恢复JTree中的扩展/选择状态

我有一个应用程序,其中包含一个支持DefaultTreeModel的JTree,它用于显示反映我服务器上文件系统一部分的文件层次结构(我将其称为我的客户端应用程序).我还有一个服务器应用程序,它提供我的客户端应用程序需要显示的数据(我将这称为我的服务器应用程序).我正在使用"懒惰加载子"方法,以便我只需要将文件加载到我的树中,如果用户对它们感兴趣的话.延迟加载方法:

  1. 我覆盖 treeWillExpand(TreeExpansionEvent evt)
  2. 我将选择路径设置为扩展节点的路径.
  3. 然后我向服务器发送一条消息,询问该节点的子节点.
  4. 当服务器响应时,我得到最后选择的路径组件.
  5. 然后我DefaultTreeModel.insertNodeInto()用于每个返回的数据文件.
  6. 最后我打电话DefaultTreeModel.nodeStructureChanged().

以上工作正常,懒惰加载孩子我没有任何问题.我的问题出现在新数据上传到服务器并且我想更新树不仅包括新数据,而且还要将扩展状态和选定节点设置为更新树之前的状态(以便用户因为有新的数据需要查看,所以不会在树上蠢蠢欲动.流程如下:

  1. 新数据上传到服务器
  2. 服务器应用程序存档此数据并使用有关上载文件的信息填充数据库.
  3. 服务器应用程序通知客户端应用程序已上载新数据.
  4. 客户端应用程序使用保存树的扩展状态 JTree.getExpandedDescendants()
  5. 客户端应用程序使用保存树的选择路径 JTree.getSelectionPath()
  6. 客户端应用程序从DefaultTreeModel中删除所有节点.
  7. 客户端应用程序从根节点开始从服务器请求数据.
  8. 客户端应用程序遍历从JTree.getExpandedDescendants()调用枚举中的JTree.expandPath()每个TreePath 返回的树路径枚举.
  9. 客户端应用程序设置选定的树路径.

我的问题是,无论我尝试什么,树的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)

java swing lazy-loading jtree defaulttreemodel

5
推荐指数
1
解决办法
2481
查看次数

带有表单生成器的 JTree

我用默认的 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)

java swing jtree removeall defaulttreemodel

4
推荐指数
1
解决办法
1470
查看次数

同时展开和折叠具有相同结构的两棵树

我想修改此链接中给出的 Swing 示例中的标准 JTree ->动态树示例 应用程序的屏幕截图如下: DynamicTreeDemo

在此处输入图片说明

我想用这个结构来维护两棵树,它们都具有完全相同的结构。当单击鼠标折叠/展开时,我应该能够同时折叠和展开两者!
此外,当用户从任一树中选择一个节点时,另一棵树中的相应节点也应突出显示。
一棵树可能包含文件/文件夹作为节点,另一棵树可能有创建时间作为节点。

我可以在每个 DynamicTree 对象中仅使用一个 Jtree 对象来使其工作吗?(请参阅示例以了解这些对象是什么)有没有办法让 Jtree 只存储一个包含来自每棵树相应节点的数据的对象,但将这些数据显示在单独的树上?

目前,我正在使用两个 Jtree,可以通过将两个父级和两个子级作为 add 函数的输入,并将相应的子级添加到相应的父级来添加节点。
但是,在remove/expand/collapse 函数中,我需要从两棵树中移除/展开/折叠两个对应的节点。我该怎么做呢?

我是 java swing 的新手,但不是 java 编程的新手。所以请说明需要Jswing知识的部分。

提前致谢。

java swing action jtree defaulttreemodel

2
推荐指数
1
解决办法
1193
查看次数

标签 统计

defaulttreemodel ×3

java ×3

jtree ×3

swing ×3

action ×1

lazy-loading ×1

removeall ×1