我一直在将Substance的外观和感觉集成到我的应用程序中,并遇到了一些关于其内部 EDT(事件调度线程)检查例程的问题。Substance 绝对拒绝在 EDT 之外构建 UI 类。我已经做了很多 Swing/AWT 并且我知道大部分关于 EDT 的规则。我使用 SwingWorker、SwingUtilties.invokeLater 来修改组件。我一直认为组件可以在 EDT 之外构建,但必须在EDT 上实现和操作。换句话说,您可以在后台构造和设置默认值,但对 pack/setVisible 的调用必须是 EDT 以及任何后续调用来操作组件。
我问的原因是我有一个特别“强大”的窗口要构建,涉及许多小部件、状态和资源(很多图标)。之前,我在 SwingWorker 的背景方法上构建了窗口,并在 done 方法中使窗口可见。从来没有一个问题。切换到 Substance 后,内部 EDT 检查让我很头疼。
我已经能够重构代码来解决这个问题。我可以在 EDT 上进行构建,这不是一个好的解决方案,因为整个应用程序都会阻塞。我还可以进行更多重构,并尽我所能加载 EDT 之外的所有额外资源。
结束它......在事件调度线程上构建Swing/AWT 小部件是否安全?