【问题标题】:how does a JTree respond to a changed DefaultMutableTreeNode?JTree 如何响应更改的 DefaultMutableTreeNode?
【发布时间】:2012-06-17 15:20:21
【问题描述】:

只是想弄清楚如果您在非 EDT 线程中更改 DefaultMutableTreeNode 的用户对象,就线程而言会发生什么?

我不是在谈论 DefaultTreeModel 事件,即 insertNodeInto 和 removeNodeFromParent,我很清楚它们应该始终在 EDT 中运行...我认为...

在节点的用户对象发生变化的情况下,似乎 JTree.TreeModelHandler 是“侦听”此类事件的东西……但有理由期望侦听器只会收到此类事件的通知更改事件发生的线程?并且只会在同一个线程中传播它的响应?

因此,很明显,我假设这是一个相当基本的“观察者”模式。

那么这是否意味着 JTree 节点中的大多数更改实际上必须发生在 EDT 中,否则会冒着事情不会按您预期发生的风险?

在 DefaultMutableTreeNode 的 API 中确实说“你必须自己进行同步”...

【问题讨论】:

    标签: java swing jtree treenode event-dispatch-thread


    【解决方案1】:

    Swing 线程规则非常简单:Swing 是单线程的,所有涉及 Swing 组件的操作都应该发生在 EDT 上。

    因此,一旦您的 TreeModel 包含 DefaultMutableTreeNodes 设置在 JTree 上,您最好确保您对模型(或节点)所做的任何更改以及触发的相应事件都发生在 EDT .

    【讨论】:

    • JTree 对这个重要原则特别敏感;另见Initial Threads
    • 谢谢...在某种程度上我想知道为什么大多数/所有 JTree(和其他 JComponent)方法没有因此涉及“isEventDispatchThread()”测试...并且不允许非 EDT 调用。 ..
    • @mikerodent 在 JavaFX 中,他们负责这一点。您可以通过设置自定义重绘管理器自己完成此操作(请参阅this article
    • @Robin 谢谢,非常有用的链接。 “我们将在 Java 1.7 中简化 Swing 调试”。同时将研究那里所说的关于这两种可能的解决方案。
    • @Robin 我现在使用 CheckThreadViolationRepaintManager... 但我现在并不认为 JTree 和 DefaultTreeModel (例如)的所有操作都必须始终发生在 EDT 中:如果这些对象“脱机” (即不显示)恕我直言,在非 EDT 线程中操作它们是完全可以的。您只需要严格确定它们何时再次由 EDT 处理。如果你搞砸了 RepaintManager 通常会抓住你。但我认为对所有 Swing 对象的所有方法进行全面的 EDT 检查限制了涉及“离线”操作的完全合法的设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2012-06-14
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多