【发布时间】:2017-02-15 15:26:30
【问题描述】:
我知道 Swing 组件并且应该从事件调度线程调用它们,但到目前为止,我开发了以事件线程为中心的测试应用程序,这意味着 UI 通过在事件调用上调用侦听器来定义程序流。但我读到其他线程不应该与 UI 通信,因为它不同步。
大多数书籍只是教如何使用单个组件,而不是如何使用 在现实世界的应用程序上下文中使用它们。
如何将已完成或正在处理的线程状态更新为摇摆组件。
更新:如果我们将侦听器配置为在ExecutorService 中调用作业,工作线程如何以安全的方式更新 UI 组件。
【问题讨论】:
-
你可以看看SwingWorker
-
您不应该从 SwingWorker 内部修改 swing 组件。它们是单独的线程,因此您应该使用“SwingUtilities.invokeLater”
-
@T.G not true : "事件调度线程:所有与 Swing 相关的活动都发生在此线程上。SwingWorker 调用 process 和 done() 方法并通知任何 PropertyChangeListener在这个线程上。” - 来自docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html - 当然你不应该在“doInBackground”中这样做......
-
是的,你说得对,我应该澄清一下,我的意思是不要修改
doInBackground中的内容。在大多数情况下,这很诱人,但必须在 EDT 调用的方法中完成。当你必须在后台做某事时,你应该调用 SwingUtilities
标签: java multithreading swing