2009-06-28 91 views
2

我正在实施Java JTree面板。此面板包含树状结构的树状结构,树状结构是树状结构(复合材料列表 - 不同类别的列表)。我根据我定义的一组接口从外部jar实现中获得这些数据结构。如何在节点对象的状态更改时动态更改JTree视图?

treenodes包含一个复选框,用户可以检查以指示被检查节点和所有子节点将变为“活动”,也就是说,由节点表示的对象应该执行某些操作,例如从一个数据库。

也可以在不激活它们的情况下选择treenodes,也就是说,没有检查复选框。

最重要的是,程序的其他部分也可以切换数据模型对象的激活状态。所以构建树模型的数据模型就是激活状态的来源。这必须通过动态地(取消)选中复选框来反映在树视图中。

现在,我该如何实现这个整体?谁应该听取哪些更改?

我现在已经将所有在节点中的类从包含激活字段的抽象类扩展而来。这是真正的数据源。当此字段更改时,应通知所有订阅的侦听器(EventListener),其中包括复选框。

我也有一个TreeSelectionModel,它基于默认的TreeSelectionModel,但扩展了功能来检查是否需要检查孩子/父母。

我的问题也许不是很清楚,但这段复杂的代码也是如此。希望你能帮助。

回答

2

你似乎有一堆活动部件。通过您的TreeModel汇入所有更改可能会很好,并且让您的JTree成为收听者,因为它会自动进行。如果你的TreeModelDefaultTreeModel的一个子类,你会得到一个fire*fireTableStructureChanged,fireTreeNodesChanged等)的方法,它会提醒你的JTree重绘。确保你在AWT EventQueue中执行了这个事件。

here is a good tutorial加载使用Tree s的示例负载。

1

查看jide组件。它包括一个checkboxtree也:

alt text

1

这听起来像你对我有个好主意 - 使节点的典型来源为“激活”的知识,并触发事件的正规来源。然后你可以让TreeModel收听,并将这些事件翻译成fireTreeNodesChanged()等,这应该会导致JTree自动更新自己。

为了避免麻烦,尝试保持节点 - >树事件关系的一种方式 - 也就是说,不要使用该树作为控制器,也不要让树事件更改激活状态。