答案很简单:不,您不能拥有 2 个EDT,这是不可能的。但是您并没有被冻结的 GUI 困住,您有一些可用的选项。
首先,两个重要的规则:
- 永远不要在 EDT 中进行冗长的计算。曾经。
- 切勿从 EDT 外部操作 Swing 组件。曾经。
违反第一条规则将导致您的 GUI 被冻结,并且在此期间不会处理任何类型的事件。这包括在计算期间要更新的 GUI,直到计算完成后才会出现。
后者经常被忽略,大部分时间都会被忽视,但它可以 - 并且将会 - 咬你的屁股,然后大多数时候回去修复它是一个巨大的皮塔饼。所以从一开始就以正确的方式去做。会发生什么?组件可能会突然显示为损坏状态,它们可能会显示为白色,或者整个应用程序可能会冻结,因为 EDT 和您的其他线程之间存在死锁(在那里,完成了)。遵守Oracle Swing 线程策略!
那么,如何避免在用户按下按钮后对 EDT 进行冗长的计算呢?选项:
- 使用SwingWorker。优点:有一个
done()
你可以使用的方法,一旦工作人员完成,它就会在 EDT 中自动执行。还实现了Future
接口,因此可用于返回结果。
- 您可以创建自己的
Runnable
并在那里进行计算。
- 使用 Java 为并行执行提供的任何其他方式。
好的,以及如何避免从 EDT 外部操纵 GUI ?
- 在那里调用
SwingUtilities.invokeLater()
并执行 Swing 操作。
done()
如上所述使用 SwingWorkers方法。
如果您遵循这两条规则,您的 Swing GUI 将处于一个更好的状态,您可以更多地关注您的应用程序开发而不是 Swing 问题。