我正在开发一个小应用程序,它将具有Swing GUI。应用程序在另一个线程中执行IO任务,当该线程完成时,GUI应相应更新以反映线程的操作结果。在运行于(工作器、非GUI)中的类中,构造函数中传递了一个对象,该对象将用于更新GUI,因此我不需要在非GUI类中放置GUI内容,而是将对象传递给该类以更新GUI。
根据我从这里阅读的理解,更新(更改)Swing GUI 的线程/ swing 安全选项将使用
对于我来说,Swing 中的所有这些线程问题有点令人困惑,但我需要使用线程在 GUI 应用程序中执行任何有意义的操作,并且在 EDT 中处理时不会挂起 GUI,所以现在我感兴趣的是:
如果可能的话,我更愿意使用
提前感谢。
根据我从这里阅读的理解,更新(更改)Swing GUI 的线程/ swing 安全选项将使用
javax.swing.SwingUtilities.invokeLater()
、javax.swing.SwingUtilities.invokeLaterWait()
和/或javax.swing.SwingWorker()
,这些选项基本上都是在做同样的事情。对于我来说,Swing 中的所有这些线程问题有点令人困惑,但我需要使用线程在 GUI 应用程序中执行任何有意义的操作,并且在 EDT 中处理时不会挂起 GUI,所以现在我感兴趣的是:
Are
invokeLater
andinvokeLaterWait
like sending message to EDT and waiting for it do it when it finishes processing messages that were before that call?is it correct from Swing thread safety aspect, to do something like this:
interface IUPDATEGUI { public void update(); } // in EDT/where I can access components directly class UpdateJList implements IUPDATEGUI { public void update() { // update JList... someJList.revalidate(); someJList.repain(); } } class FileOperations implements Runnable { private IUPDATEGUI upObj; List<File> result = new ArrayList<File>; // upObject is accessing this public void FileOperations(IUPDATEGUI upObj) { this.upObj = upObj; } private void someIOTask() { // ... // IO processing finished, result is in "result" } public void run() { someIOTask(); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { upObj.update(); // access result and update JList } }; ); } }
如果可能的话,我更愿意使用
invokeLater
而不是SwingWorker
,因为我不需要改变整个类,而且它更加简洁明了(就像在Win32应用程序中发送消息一样)。提前感谢。