bas*_*ero 33 java user-interface swing multithreading awt
我一直在将Substance的外观和感觉整合到我的应用程序中,并遇到了几个关于它的内部EDT(事件调度线程)检查例程的问题.Substance绝对拒绝在EDT之外构建UI类.我已经做了很多Swing/AWT,我知道关于EDT的大部分规则.我使用SwingWorker,SwingUtilties.invokeLater来修改组件.我总是认为组件可以在EDT之外构建,但必须在EDT上实现和操作.换句话说,您可以在后台构造和设置默认值,但对pack/setVisible的调用必须是EDT以及操作组件的任何后续调用.
我问的原因是我有一个特别"强大"的窗口来构建,涉及许多小部件,状态和资源(许多图标).以前,我在SwingWorker的背景方法上构建了窗口,并在done方法中使窗口可见.从来没有一个问题.切换到Substance后,内部EDT检查会让我感到困惑.
我已经能够重构代码来解决这个问题.我可以在EDT上构建这不是一个好的解决方案,因为整个应用程序将阻止.我还可以进行更多的重构,并尽力在EDT之外加载所有额外的资源.
把它包装起来...... 构建 Swing/AWT小部件不是在Event Dispatch Thread上安全吗?
没有.
简单的原因是,即使EDT在某些罕见的情况下也喜欢死锁,一般来说,使用Swing时很容易使用户界面死锁(或者我已经被告知).我建议你阅读Kirill's(Substance dev)博客上的这三篇文章: