【发布时间】:2009-10-10 08:05:17
【问题描述】:
我已经构建了自己的组件来扩展 JPanel。我添加了一些方法,例如 calculateWhatever()... 我也应该用 invokeLater() 调用这些方法吗? Substance L&F 并没有抱怨它,但我遇到了罕见的随机绘画问题,我想知道它们是否因为扩展摆动组件内部的计算而发生。
【问题讨论】:
标签: java multithreading swing
我已经构建了自己的组件来扩展 JPanel。我添加了一些方法,例如 calculateWhatever()... 我也应该用 invokeLater() 调用这些方法吗? Substance L&F 并没有抱怨它,但我遇到了罕见的随机绘画问题,我想知道它们是否因为扩展摆动组件内部的计算而发生。
【问题讨论】:
标签: java multithreading swing
如果您正在执行大量计算,那么谨慎的做法是在事件调度线程以外的线程中执行它们。如果您使用的是 JDK 1.6,您还可以使用 SwingWorker 类而不是 invokeLater。
【讨论】:
当您从这些方法中修改您的组件(或在其上绘画)时,您只需要使用invokeLater()(或使用SwingWorker)调用这些方法。如果您只是进行计算,则只需要在访问结果时进行同步,例如paint() 方法。
【讨论】:
您通常应该使用SwingUtilities.invokeLater 或SwingWorker 将GUI 组件的更改与任何潜在的锁定情况(文件I/O 或远程服务器调用)或处理器密集型操作隔离开来。如果您的计算执行任何磁盘读取或写入,或者如果您调用服务器,我建议您重新组织代码以在 AWT 线程中完成所有绘制调用。同样,如果您意识到您的计算需要很长时间才能完成并且您的 GUI 看起来很迟钝,那么将它们分开是谨慎的。
【讨论】: