问题标签 [defaulttreemodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用文本文件中的数据创建 JTree
如何JTree
从.txt
文件中创建使用数据?文本文件格式如下:
该.txt
文件包含 700 多行。
java - 使用延迟加载恢复 JTree 中的扩展/选择状态
我有一个应用程序,它包含一个带有 DefaultTreeModel 支持的 JTree,用于显示文件层次结构,该层次结构反映了我的服务器上文件系统的一部分(我将其称为我的客户端应用程序)。我还有一个服务器应用程序,它提供我的客户端应用程序需要显示的数据(我将其称为我的服务器应用程序)。我正在使用“延迟加载子项”方法,因此如果用户对它们感兴趣,我只需将文件加载到我的树中。延迟加载方法:
- 我覆盖
treeWillExpand(TreeExpansionEvent evt)
- 我将选择路径设置为扩展节点的路径。
- 然后我向服务器发送一条消息,询问该节点的子节点。
- 当服务器响应时,我得到最后选择的路径组件。
- 然后我使用
DefaultTreeModel.insertNodeInto()
每个返回的数据文件。 - 最后我打电话
DefaultTreeModel.nodeStructureChanged()
。
以上工作正常,我对懒惰加载孩子没有任何问题。当新数据上传到服务器时,我的问题出现了,我想更新树以不仅包含新数据,而且还将扩展状态和选定节点设置为更新树之前的状态(以便用户不会因为有新数据要查看而在树上猛拉)。流程如下:
- 新数据上传到服务器
- 服务器应用程序存档此数据并使用有关上传文件的信息填充数据库。
- 服务器应用程序通知客户端应用程序新数据已上传。
- 客户端应用程序使用保存树的展开状态
JTree.getExpandedDescendants()
- 客户端应用程序使用保存树的选择路径
JTree.getSelectionPath()
- 客户端应用程序从 DefaultTreeModel 中删除所有节点。
- 客户端应用程序从根节点开始向服务器请求数据。
JTree.getExpandedDescendants()
客户端应用程序遍历调用枚举JTree.expandPath()
中的每个 TreePath返回的树路径枚举。- 客户端应用程序设置选定的树路径。
我的问题是,无论我尝试什么,树的 GUI 都不会更新以反映扩展状态。我知道我对 expandPath 的调用正在工作,因为我可以看到客户端发送的数据请求以及每次调用 expandPath 时来自服务器的数据响应。我还在另一个窗口中显示有关当前选定节点的信息,它显示了正确选择的节点。但是,唉,令我失望的是,GUI 只显示了根节点(展开)和它的子节点(未展开),而不是之前的展开状态。
所以我的问题是:如何恢复 JTree 的扩展状态,以便 GUI 在数据模型更新前后保持不变?
这些是我尝试过的一些事情:
- 我找到了一个与我的设置相似的线程,他的问题通过覆盖解决了
equals()
,hashCode()
但这对我不起作用。 - 调用扩展的各种方法,例如:
setExpandsSelectedPaths(true)
,nodeStructureChanged()
,JTree.invalidate()
- 保存扩展状态有许多不同的变化,但是,我不相信扩展状态是不正确的,因为我可以看到正确的数据在客户端应用程序和服务器应用程序之间来回传递。
这是我的SSCCE:
提前感谢您提供的任何帮助。
PS这是我的第一个问题,所以如果我问得正确,请告诉我(并且放轻松;))。
java - 从 JTree 中的文本文件动态填充树模型
我面临的问题是 JTree 的树模型。
我将根节点定义为:
当应用程序第一次启动时,我希望创建和加载 treeModel。为此,我使用了一个文件 meta.txt,其中包含如下信息:
第一列是级别,第二列是树的节点。现在基于这些信息,我想创建树模型,但在这里遇到了障碍。
我不确定将上述节点添加到根节点的逻辑。我尝试过的每件事似乎都有缺陷。这里的问题是没有固定的级别,所以我不能简单地使用 if-else 构造。我正在使用以下代码:
这似乎工作正常,但谁能告诉我这是否是正确的方法?
java - 带有表单生成器的 JTree
我用默认的 NetBeans 编辑创建了一个表单并jTree
在上面放了一个。然后它以某种方式在其中创建了一堆元素,例如“颜色”、“运动”、“食物”。但它不在创建代码中。它来自哪里,我该如何编辑它......
即使我做jTree1.removeAll();
了所有事情仍然存在......而且我的代码没有用于将新项目添加到 jTree 工作。
我需要能够jTree
在运行时编辑内容。
java - 复合 JTree 节点允许事件传递到下面的对象
我浏览了@Jakub Zaverka 的答案,这很清楚。但我不明白的是创建树节点的代码(JTree、食物、运动、颜色)在哪里。有人可以解释如何创建节点。
如果我创建一个具有 JButton 和 JLabel 作为字段的扩展 JPanel 的节点,我可以使用 JTree 的构造函数设置节点,该构造函数将由相同的自定义渲染器和编辑器渲染和编辑。
java - 如何在不可见时从 TreeModel 中注销 JTree?
我怎样才能让一个JTree
只听它TreeModel
,而它实际上对用户可见,或者至少让它在相应JFrame
的处理后立即取消注册?
据我所知,JTree
从模型中注销自身的唯一情况是,如果您将其传递给新模型(使用setModel(…)
)。
如果模型是从其他地方引用的,这会导致树不会被垃圾收集。示例:我TreeModel
使用 a实现了WatchService
一个始终保持最新的文件系统树模型。即使模型上的单个侦听器也需要我不断WatchService
通知模型有关文件系统更改的信息,因此它不能被垃圾收集。因此,即使JTree
不再可见,它仍然由模型保存在内存中,仍然需要从 获取更新WatchService
,尽管这些都不再需要了。
我想最好的方法是创建一个新的扩展类JTree
来注册和注销模型。如果是这样,在显示或处置组件时会调用哪些方法?可能addNotify()
并且removeNotify()
是好的候选人?
java - JTree 在 insertNodeInto 之后不显示更改
我有一个需要在加载数据时填充的 JTree。我用 DefaultTreeModel 创建树
其中 root 是一个 MutableTreeNode 实现。当我需要显示的数据被更改或添加时,触发了一个监听器,它调用
调试器显示,插入被调用,但树本身并不反映更改。如果我称reload()
树已绘制,但它也会折叠所有节点。模型正在更改并且节点已正确添加。我错过了什么?
java - DefaultTreeModel中是否需要调用nodesWereInserted()等类似方法?
在DefaultTreeModel中,您可以使用方法插入节点insertNodeInto()
。但是,我注意到也存在nodesWereInserted()
具有这个非常简洁的 Javadoc 的方法:
将一些 TreeNode 插入节点后调用此方法。
我觉得很奇怪这是一种公共方法。我希望如果它向听众触发 ChangeEvents,它应该是一个由insertNodeInto()
. 似乎调用一个方法来通知另一个方法调用的更改与 Java Swing 的设计方式有些不一致(我elementIsInserted()
在向 JComboBox 添加元素时不调用方法)。
nodesWereInserted()
但是我发现在我的代码中,如果我调用after并不重要insertNodeInto()
。无论哪种方式,结果都与添加到树并在 GUI 中显示的节点相同。
那么有人可以解释一下是否有必要nodesWereInserted()
在 DefaultTreeModel 中调用和类似方法吗?如果是这样,为什么?它有什么insertNodeInto()
自己做不到的?
java - 无法将叶子添加到 Jtree
我正在尝试构建一棵树,但我不能添加任何叶子,只能添加到根。下面的例子对你有什么帮助吗?谢谢, 詹卢卡
在这里我添加到树
这里是主要的,只是为了展示面板
这些只是运行此示例的方法。
java - JTree 显示问题
我对java不太了解。我在 JTree 中编写了这段代码,但是当我运行程序时,JTree 只显示最后一个 fList。有什么可以添加到代码中以便 JTree 显示所有这些内容的吗?JTreeCode 是同一个包中的另一个类。