我正在開發一個小應用程序,它將具有Swing GUI。應用程序正在另一個線程中執行IO任務,當該線程完成時,GUI應該根據線程的操作結果進行更新。在(工作者,非GUI)中運行的類在構造器中傳遞給它的對象將用於更新GUI,所以我不需要將GUI的東西放在非GUI類中,而是傳遞用於更新GUI的對象到那個班。 正如我所瞭解的表格閱讀(線程/擺動)更新(更改)安全選項Swing GUI將使用javax.swing.SwingUtilities.invokeLater()
,javax.swing.SwingUtilities.invokeLaterWait()
和/或javax.swing.SwingWorker()
基本上是做同樣的事情。使用invokeLater或SwingWorker從另一個線程更新Swing組件
這與Swing所有線程問題對我來說是有點混亂,但我需要使用線程做任何事情在GUI應用程序有意義,而不是掛GUI處理時,在美國東部時間,所以自己感興趣的事情,現在是這樣的:
是
invokeLater
和invokeLaterWait
如發送消息,美國東部時間並等待它做它時,它完成將原本調用之前處理消息?它與Swing線程安全性方面是正確的,做這樣的事情:
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應用程序中發送消息)。
在此先感謝。
在這種情況下更新組件後是否需要調用revalidate()和repaint()? – Mil 2010-02-12 00:33:55