问题标签 [jtree]

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.

0 投票
4 回答
7357 浏览

java - Swing题/JTree/自定义树模型

我遇到了问题和希望,有人知道出了什么问题以及原因,并且能够向我解释我现在错过了什么,以使该事情按建议工作。

我有一个基于自定义 TreeModel(“WRTreeModel”,见下文)的 JTree。该模型将用于的数据结构是构建一个根对象,该对象包含一些字段,此外还有一个由下面显示的“ArrayListModel”支持的列表。当我使用 WRTreeModel 构建树时,它看起来不错。我能够展开和折叠代表对象中包含的列表和字段的节点。我可以展开和折叠这些列表并查看它们的内容等等。

现在我想删除其中一个列表的一个子项,并且 - 正如我已经知道的那样 - 通过从调用 ArrayListModel 的 remove 方法的模型中删除它来完成。为了让 WRTreeModel 知道那个 remove,第一件事就是调用它的 fireIntervalRemoved 方法被调用,到目前为止一切顺利。

在 WRTreeModels 内部类 ArrayModelListener 中,intervalRemoved 方法准备调用 fireTreeNodesRemoved,然后构建一个 TreeEvent,该 TreeEvent 转发到所有已注册的 TreeModelListeners(因此 JTree 在连接到模型时会自动注册自己)。

现在我希望树反映变化并更新它的内部和视觉表示以显示新状态。不幸的是,这似乎不起作用。有事情发生。但是当我点击节点时,我只是改变了一些 EventHandler-Exceptions 被抛出。显然有些事情真的很混乱。

我知道即时回答这样的问题并不容易,但我非常感谢您能快速回答。如果有人知道解释自定义树模型的使用(不在 DefaultMutableTreeNode 或任何给定的基于实现的类上)以及 JTree 的事件处理和更新如何工作的网站,这也会有所帮助。

最诚挚的问候,

托马斯艺术



0 投票
2 回答
1299 浏览

java - 根据 JTree 的选择在 JPopupMenu 中显示/隐藏 JMenuItems

我有一个 JTree,当我右键单击 JTree 中的节点时,它会显示一个 JPopupMenu。根据在 JTree 中选择的节点,在我的 JPopupMenu 中隐藏/显示或启用/禁用某些 JMenuItem 的最佳方法是什么?

想到的第一个解决方案是将 TreeSelectionListener 添加到 JTree 以用于“值更改”事件。在事件处理代码中,我将使用 TreeSelectionEvent 的 getNewLeadSelectionPath() 方法来获取最近选择的路径,并使用生成的 TreePath 对象的 getLastPathComponent() 方法来获取选定的节点。从这里我将有一系列 IF 语句访问我的 JPopupMenu 对象并执行隐藏/显示特定 JMenuItems 所需的修改。

但是,对此感觉有些不对劲,所以我决定问 SO 是否有更好的方法。

0 投票
6 回答
6186 浏览

java - 加快展开/折叠 JTree 的所有节点

我有一个具有大约 100000 个或更多节点的 JTree。现在我想扩展整棵树。为此,我使用我在这里找到的解决方案。

我的问题是扩展这么大的树需要 60 秒或更长时间,这不是很方便。有人对我如何加快扩展有任何建议吗?

0 投票
8 回答
60910 浏览

java - 将一些节点添加到底层模型后,如何刷新 JTree?

首先,让我说我不使用 DefaultTreeModel。我实现了自己的 TreeModel,所以我不能使用 DefaultXXX 的东西。问题是这样的:通过我的模型定义的一些 addStuff() 方法,我将节点添加到底层数据结构中。然后我通过在 addStuff() 函数中调用 treeNodesChanged() 来通知侦听器(我知道有 treeNodesInserted 方法,但它是同一件事。它只是用不同的方法通知侦听器)。现在,其中一个侦听器是我的主窗体中的一个静态类,这个侦听器可以告诉也包含在我的主窗体中的 JTree 刷新自身。如何告诉 JTree 从模型中“重新加载”其部分或全部节点?

更新:发现这个问题虽然不完全相同,但它给出了我想要的答案。

更新2:我的问题不是如何通知查看器(JTree),而是在模型通知后应该以何种方式重新加载jtree。

首先让我说,我知道刷新树以反映底层更改的唯一方法是调用 updateUI(),或重用 setModel() 方法。本质上,我的问题是:

假设 TreeModelListener 刚刚被通知(通过 TreeModelListener API)模型中发生了更改。好的,现在呢?

我有这个问题是因为 JTree 没有实现 TreeModelListener。因此,在我的情况下,侦听器是 JTree 的容器,或者是实现侦听器的内部类,与 Jtree 位于同一容器下。

所以假设我是一个 TreeModelListener 实现,和我的兄弟 JTree 一起快乐地生活在一个 JForm 中。突然我的方法 treeNodesInserted(TreeModelEvent evt) 被调用。现在我该怎么做?如果我从内部调用 Jtree.updateUI(),则模型的侦听器列表会引发 ConcurrentModification 异常。我可以调用 updateUI 以外的其他名称吗?

我尝试了很多东西,但只有 updateUI 刷新了 JTree。所以我在听众之外做了。在 JForm 中,我只调用模型的方法来改变底层结构,然后调用 updateUI。没有使用 TreeModelListener。

UPDATE3:我发现有隐式 TreeModelListeners 注册。在我的模型的 addTreeModelListener(TreeModelListener listener) 实现中,我放了一个调试 system.out 行:

我在执行 jTree.setModel(model) 时看到了这个调试输出:

监听器添加:javax.swing.JTree.TreeModelHandler

监听器添加:javax.swing.plaf.basic.BasicTreeUI.Handler

ConcurrentModificationException 是因为对 jtree.updateUI() 的调用重新注册了侦听器(仅 plaf,而不是两者),所以当我在侦听器通知循环中调用 updateUI 时会抛出它。现在刷新树的唯一方法是在 TreeModelListener 之外进行。对于更好的解决方案有任何意见或想法吗?我错过了什么吗?

0 投票
4 回答
6291 浏览

java - 创建动态 JTree(控制根节点的可见性)

我有一个关于如何动态生成 JTrees 的问题。有没有办法在不使其子节点不可见的情况下将根节点设置为不可见?我尝试执行以下操作,但它将所有节点显示为不可见。请记住,我想随时添加和删除根节点的子节点。我添加了评论,以便您可以按照我的意图进行操作。让我知道他们是否在做我不需要的事情,因为我是 JTrees 的新手并且不知道约定。我还希望能够为听众选择多个孩子。

在上面的例子中。什么都没有显示,当我删除“tree.setRootVisible(false)”时,一切都是可见的,包括节点。

0 投票
1 回答
8748 浏览

java - Java:如何在 JTree 中显示 XML 文件

我想有一种方法可以在JTree. 我已经使用 DOM 通过实现自定义TreeModel(and TreeCellRenderer) 实现了这一点。然而,它非常笨重(很多变通方法和骇客)并且边缘相当粗糙。

有没有人知道一种方法来JTree显示用 SAX 解析的 XML 文件的内容?

谢谢!

0 投票
2 回答
7464 浏览

java - 使用 JCheckBox 节点进行 JTree 渲染

我正在尝试修改标准的 Swing JTree 以混合带有和不带有复选框的节点。这是一个例子:

替代文字

当我尝试选中/取消选中其中一个复选框(本示例中的“用户 01”节点)时,树会丢失节点:

替代文字

我的代码是对这个例子的改编:http ://forums.sun.com/thread.jspa?threadID=5321084&start=13 。

而不是像这样在 DefaultMutableTreeNode 中嵌入 JCheckBox:

我认为创建一个从 DefaultMutableTreeNode 派生的模型节点更有意义,我称之为 JTreeNode。此类自动将 DefaultMutableTreeNode 的 UserObject 设置为 JCheckBox。TreeCellRenderer 使用类的 ShowCheckBox 属性来确定是使用 JCheckBox 还是 DefaultTreeCellRenderer。JTreeNode 是这样使用的:

我相信问题出在实现 TreeCellEditor 的类上,特别是在 getCellEditorValue() 或 getTreeCellEditorComponent() 方法中。我怀疑这个问题与 getCellEditorValue() 返回 DefaultMutableTreeNode 的派生而不是更简单的模型实例有关。

这是 TreeCellRender 的 getTreeCellRendererComponent() 方法:

任何想法都非常感谢。

0 投票
1 回答
1284 浏览

java - JTree在单元格中具有左右对齐的文本?

我想要做的是创建一个 JTree,每个单元格包含普通文本,但也包含每个单元格的右对齐文本(右对齐到树的边缘,无论层次结构级别如何)。

我尝试创建自己的 TreeCellRenderer,但单元格的大小没有更新。我也使用自定义树 UI 尝试了这个想法,但遇到了类似的问题。

我也尝试过创建一个自定义组件,在树的右侧“粘合”了一个 JPanel。这是最成功的,但我无法让树单元向右延伸并触摸这个额外的面板:

替代文字 http://img718.imageshack.us/img718/3676/problem.png

0 投票
1 回答
336 浏览

java - 无选择的Jtree节点扩展

是否可以在不选择 JTree 的情况下展开/折叠节点?(未突出显示)

非常感谢

0 投票
1 回答
1332 浏览

java - java JTree没有更新

我在使用 JTree 时遇到了一些问题。当我在同一个类中创建我的 DefaultTreeModel 时,JFrame 更新得很好。但是,我想从另一个类调用更新方法,当我这样做时,JTree 保持空白。JTree 在类 GUI 中,并像这样存储在另一个名为 store 的类中。

...

但是,这无济于事。然而,我在我调用的类 GUI 中:

一切正常。有没有人知道为什么会出现问题?

构建树方法如下:

提前谢谢了。