【问题标题】:Why does JTree handle events from DefaultTreeModel but not TreeModel?为什么 JTree 处理来自 DefaultTreeModel 而不是 TreeModel 的事件?
【发布时间】:2012-11-05 06:06:36
【问题描述】:

我注意到在 jTree 中调用 & 定义的 jTree.treeModelHandler 为 treeNodesChanged 和 treeNodesInserted 事件实现了空白方法。 DefaultTreeModel 会触发一个 treeNodesInserted 事件,并且 jTree 会自行更新。但是,当我从 TreeModel 触发相同的事件时,什么也没有发生。

当树没有实现任何明显的方法时,我无法确定树如何从 DefaultTreeModel 更新。

我在这里错过了什么?

更新:解决方法 org.jdesktop.swingx.tree.TreeModelSupport。很棒的套件!添加为我的 TreeModel 接口对象的字段。然后将所有触发和 treeModelListener 方法委托给它。使用 JTree 比使用 DefaultTreeModel 效果更好,甚至使用 JXTree 效果更好。我只实现了单数选择/插入/删除,但到目前为止,树在所有测试中都表现正确。

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布SSCCE 演示的问题,简短、可运行、可编译,可以基于Oracle 关于XxxTreeListener 的教程,我认为这个问题在此无法回答形式
  • +1 用于解决 TreeModelSupport (偏向于我 :-) 顺便说一句:树将所有模型视为相同并正确更新自身,前提是它们正确触发事件(这不是微不足道的)。 “主”监听在 ui-delegate 中处理,JTree 本身的处理程序只是一个小调整

标签: java swing jtree event-listener treemodel


【解决方案1】:

DefaultTreeModel 会自行触发。侦听器位于模型上(因此您可以让两个 JTree 查看一个 TreeModel 的更改)。所以模型是通知所有听众的正确位置。

我认为应该尝试扩展 AbstractTreeModel,使其具有一些基本的基础架构。不是真的


TreeModel 也有 TreeModelListeners。对于数据的更改。 JTree 就是这样一个监听器。 JTree 有视图方面的侦听器,分支是否扩展等等。

在您的 TreeModel 中,必须遍历所有添加的 TreeModelListeners 并调用适当的事件,例如 treeNodesInserted。

【讨论】:

  • Flameware == 我看不到基于标准 Oracle API 的 AbstractTreeModel,从来没有,我认为这个问题无法以这种形式回答
  • @Joop - 监听器肯定在树上,如果你有 2 棵树,那么你将有 2 组监听器,每棵树一个。
猜你喜欢
  • 1970-01-01
  • 2018-01-21
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多