我正在实现一个Java JTree面板。此面板包含一组树状结构的TreeModel构建,这些结构是树状的(复合材料列表列表 - 不同的类)。我根据我定义的一组接口从外部jar实现中获取这些数据结构。
treenodes包含一个复选框,用户可以检查该复选框以指示已检查的节点和所有子节点将变为“活动”,即由节点表示的对象应该执行某些操作,例如从数据库中。
也可以在不“激活”它们的情况下选择treenodes,也就是说,不选中复选框。
最重要的是,程序的其他部分也可以切换数据模型对象的激活状态。因此,构建树模型的数据模型是激活状态的来源。这必须通过动态(取消)选中复选框反映在树视图中。
现在,我该如何实现这一整体?谁应该成为听众的变化?
我现在让节点中的所有类都从包含激活字段的抽象类扩展。这是真正的数据源。当此字段更改时,应通知所有订阅的侦听器(EventListener),这包括复选框。
我还有一个TreeSelectionModel,它基于默认的TreeSelectionModel,但扩展了功能以检查是否需要检查子/父。
我的问题可能并不是很清楚,但这段复杂的代码也是如此。希望你能帮忙。
答案 0 :(得分:2)
你好像有一堆活动部件。通过TreeModel
汇总所有更改可能会很有用,并让您的JTree
成为聆听者,因为它会自动生成。如果您的TreeModel
是DefaultTreeModel
的子类,则会获得大量fire*
(fireTableStructureChanged
,fireTreeNodesChanged
等方法,这些方法会提醒您的JTree重绘。确保在AWT EventQueue中执行此事件触发。
here is a good tutorial,其中包含大量使用Tree
s。
答案 1 :(得分:1)
查看jide组件。它还包括checkboxtree:
答案 2 :(得分:1)
听起来我觉得你有正确的想法 - 让节点成为“激活”知识的规范来源,以及激活事件的规范来源。然后,您可以让TreeModel
收听并将这些事件转换为fireTreeNodesChanged()
等,这会导致JTree
自动更新。
为了避免麻烦,请尝试保留节点 - >树事件关系的一种方式 - 也就是说,不要将树用作控制器,不要让树事件改变激活状态。