【问题标题】:How to change JTree view dynamically when a nodes object's state changes?当节点对象的状态发生变化时,如何动态更改 JTree 视图?
【发布时间】:2009-06-28 23:13:25
【问题描述】:

我正在实现一个 Java JTree 面板。该面板包含从一组树状数据结构构建的 TreeModel(组合列表 - 不同类)。我根据我定义的一组接口从外部 jar 实现中获取这些数据结构。

treenodes 包含一个复选框,用户可以选中该复选框以指示选中的节点和所有子节点都将变为“活动”,即由节点表示的对象应该做一些事情,比如从一个数据库。

也可以选择树节点而不“激活”它们,即不选中复选框。

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

现在,我该如何实现这一切?谁应该成为哪些变化的听众?

现在,节点中的所有类都从一个包含激活字段的抽象类扩展而来。这是真正的数据源。当此字段发生变化时,应通知所有订阅的侦听器(EventListener),这包括复选框。

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

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

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    您似乎有一堆活动部件。通过您的TreeModel 汇集所有更改可能会很好,并让您的JTree 成为听众,因为它会自动发生。如果您的TreeModelDefaultTreeModel 的子类,您将获得许多fire*fireTableStructureChangedfireTreeNodesChanged 等)方法,这些方法会提醒您的JTree 重新绘制。确保在 AWT EventQueue 中触发事件。

    here is a good tutorial 包含大量使用 Trees 的示例。

    【讨论】:

      【解决方案2】:

      查看jide 组件。它还包括一个复选框树:

      【讨论】:

        【解决方案3】:

        在我看来,您的想法是正确的——让节点成为“激活”知识的规范来源,以及激活事件的规范来源。然后您可以让TreeModel 收听并将这些事件转换为fireTreeNodesChanged() 等,这应该会导致JTree 自动更新自身。

        为了让自己免于麻烦,尽量保持节点->树事件关系的一种方式——即不要将树用作控制器,不要让树事件改变激活状态。

        【讨论】:

          猜你喜欢
          • 2011-01-13
          • 2013-02-04
          • 2020-01-27
          • 2014-10-23
          • 1970-01-01
          • 1970-01-01
          • 2015-07-23
          • 2023-03-16
          • 2021-10-06
          相关资源
          最近更新 更多