我想在Swing中创建一个新的事件派发线程,但我无法在线查找任何参考资料以了解如何执行此操作。我通过创建一个新线程并调用Application.run(...)在.NET中完成了这个。有没有人这样做过?在Swing中有可能吗?
仅供参考我之所以这样做,是因为我正在编写一个Eclipse插件,我想弹出一些不是IDE模态的对话框,而是对我的UI逻辑进行模态(阻塞)。我可以使用非模态对话框和回调来实现这一点,但这需要使我的代码多线程的开销。如果前者不可能,我会再回过头来。
答案 0 :(得分:5)
我对你的问题感到有点困惑,因为你提到了Swing,但后来说你正在编写一个Eclipse插件。由于这个问题被标记为Swing,我将给出一个Swing答案(但是发布为CW)。
有一个事件派发线程。总有一个事件派发线程,除非根本没有。你不能创建另一个。
但是,您可以更改对话框的ModalityType
,或更改窗口的ModalExclusionType
。在这种情况下,如果您自己编写此内容,则应将顶级窗口ModalExclusionType
设置为APPLICATION_EXCLUDE
。
但同样,我不知道这对你有什么帮助,因为Eclipse使用SWT而不是Swing。
答案 1 :(得分:5)
是的,这是可能的。我已经在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)。
无论如何,这样做基本上需要建立两个AppContexts,每个AppContexts都有自己的EDT线程。
答案 2 :(得分:2)
我要把我的最后一个答案丢掉,重新开始。
在SWT中,您可以通过在创建过程中传递SWT.PRIMARY_MODAL样式标志来创建仅为父模式的Shell
s(窗口)或自定义Dialog
。
请注意Dialog
是一个抽象类,因此您必须创建自己的类。使用Shell
可能更容易。
编辑:
为何选择SWT?因为这是Eclipse使用的。有关详细信息,请参阅:Eclipse Platform Plug-in Developer Guide(压缩PDF)。最新版本可在Eclipse的帮助系统中找到(帮助>帮助目录>插件开发环境指南。)