【问题标题】:Multiple Swing event-dispatch threads多个 Swing 事件调度线程
【发布时间】:2010-10-25 22:45:05
【问题描述】:

我想在 Swing 中创建一个新的事件调度线程,但我在网上找不到任何关于如何执行此操作的参考资料。我通过创建一个新线程并调用 Application.run(...) 在 .NET 中完成了这项工作。有人做过吗?在 Swing 中可以吗?

仅供参考,我尝试这样做的原因是因为我正在编写一个 Eclipse 插件,并且我想弹出对 IDE 来说不是模态但对我的 UI 逻辑来说是模态(阻塞)的对话框。我可以使用非模态对话框和回调来完成此操作,但这需要使我的代码成为多线程的开销。如果前者不可行,我会恢复。

【问题讨论】:

  • @mmyers:据我所知,没有。
  • 仅供参考,我的 Swing 对话框会阻止 IDE
  • 我仍然想知道这在 Swing 或 SWT 中是否可行。现在我可以忍受窗口是模态的。如果问题太大,我会硬着头皮用无模式对话框重写它。

标签: java multithreading swing modal-dialog ui-thread


【解决方案1】:

是的,这是可能的。我已经在 Swing 中完成了这样的多个 EDT 调度线程逻辑。然而,最终结果是它不能可靠地工作。

(a) 所有 JVM 都不能很好地与多个 EDT 线程一起工作(本机代码中的图形渲染逻辑中的同步问题等,IBM JVM 因多个 EDT 线程而失败,Sun JVM 和 Apple JVM 确实有效)

(b) Swing 渲染逻辑很少有导致随机渲染错误发生的错误(例如,http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6727829)。

无论如何,这样做基本上需要建立两个 AppContext,每个都有自己的 EDT 线程。

【讨论】:

    【解决方案2】:

    我对你的问题有点困惑,因为你提到了 Swing,但又说你正在编写一个 Eclipse 插件。由于问题被标记为 Swing,我将给出一个 Swing 答案(但发布为 CW)。

    有一个事件调度线程。总是有一个事件调度线程,除非根本没有。您不能再创建一个。

    但是,您可以更改对话框的ModalityType,或更改窗口的ModalExclusionType。在这种情况下,如果您是自己编写的,您可以将顶层窗口的 ModalExclusionType 设置为 APPLICATION_EXCLUDE

    但是,我不明白这对您有什么帮助,因为 Eclipse 使用 SWT 而不是 Swing。

    【讨论】:

    • SWT 似乎使用了类似的模态系统,所以这最终可能会让您走上正轨。但我对它不够熟悉,无法详细解释。
    • 其实 PlugIn 和 WebStart 有多个 EDT。但是,API 不公开,您不能将组件混合在一起。
    • 我不得不承认我实际上并没有意识到 Eclipse 是用 SWT 编写的,尽管这是有道理的。我对 Java 比较陌生,我的背景主要是 .NET。不过我确实知道我实际上可以从我的 Eclipse 插件中创建和显示 Swing 对话框。
    • 我没有很多 Swing 代码,所以我可能会转换为 SWT。但是我认为这不会有帮助,因为我认为我不能将 IDE 设置为排除模态,这也不是一个好主意。
    【解决方案3】:

    我将放弃我的最后一个答案并重新开始。

    在 SWT 中,您可以通过在创建过程中传递 SWT.PRIMARY_MODAL 样式标志来创建 Shells (windows) 或自定义 Dialogs,它们仅对父模式是模态的。

    请注意,Dialog 是一个抽象类,因此您必须创建自己的类。使用Shell 可能更容易。

    编辑:

    为什么选择 SWT?因为那是 Eclipse 使用的。有关详细信息,请参阅:Eclipse Platform Plug-in Developer Guide(压缩 PDF)。最新版本可在 Eclipse 的帮助系统中找到(帮助 > 帮助内容 > 插件开发环境指南。)

    【讨论】:

    • 感谢您的建议。然而,它并没有做我需要的。我需要一种本质上是无模态的模态类型,即使对于直接父级也是如此,同时仍然阻止对 open() 的调用。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2014-08-11
    • 2015-04-01
    • 2011-11-11
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多