一尘不染

在事件调度线程上构造SWING / AWT小部件是否安全?

java

我一直在将Substance外观整合到我的应用程序中,并且遇到有关内部EDT(事件调度线程)检查例程的一些问题。物质绝对拒绝在EDT之外构造UI类。我已经做了很多Swing / AWT,并且我了解有关EDT的大多数规则。我使用SwingWorker,SwingUtilties.invokeLater修改组件。我总是尽管可以在EDT之外构造这些组件,但是必须在EDT上实现和操纵这些组件。换句话说,你可以在后台构造和设置默认值,但是对pack / setVisible的调用必须是EDT,以及随后的任何操作该组件的调用。

我问的原因是,我要构建一个特别的“漂亮”窗口,其中涉及许多小部件,状态和资源(很多图标)。以前,我是在SwingWorker的背景方法上构建窗口的,并在done方法中使该窗口可见。从来没有一个问题。切换到Substance后,内部EDT检查将我咬了。

我已经能够重构代码来解决这个问题。我可以在EDT上构建一个不好的解决方案,因为整个应用程序都会阻塞。我还可以进行更多重构,并尽力将所有额外的资源加载到EDT之外。

包装起来… 在事件调度线程上构造 SWING / AWT小部件是否安全?


阅读 385

收藏
2020-03-24

共1个答案

一尘不染

为了避免发生死锁,你必须格外小心,仅从事件调度线程创建,修改和查询Swing组件和模型。

请注意,所有正式的Sun 示例都已重写,并且对此非常严格。

可能是多核计算机作为台式机的可用性不断提高,从而重新制定了规则-线程问题在客户端堆栈上变得越来越明显,并且由于对EDT指南的要求非常严格,很多他们可以从一开始就被阻止。

2020-03-24