2012-08-10 57 views
4

與swing工作人員交互EDT的常用方法是使用get()方法。但我有一個長期的任務,這樣的代碼:我應該使用SwingWorker.doInBackground()裏面的SwingUtilities.invokeLater()嗎?

public Void doInBackground() { 
    for(Object o : objects) { 
     doSomething(); 
     MyGlobalGUIConsole.addMessage("Done for " + o); 
    } 
} 

在大多數tutotials建議使用返回值得到的東西從SwingWorker的到美國東部時間回來,但我能不能:

public Void doInBackground() { 
    for(Object o : objects) { 
     doSomething(); 
     SwingUtilities.invokeLater(new Runnable() {   
      @Override          
      public void run() {        
       MyGlobalGUIConsole.addMessage("Done for " + o); 
      }            
     });             
    } 
} 

回答

9

你可以,但SwingWorker具有設計用於報告後臺任務進度的方法:您從doInBackground()中調用publish()發佈進度,並且您覆蓋process()(在EDT中調用)以顯示進度。所以上面的代碼可以被改寫爲:

public Void doInBackground() { 
    for(Object o : objects) { 
     doSomething(); 
     publish("Done for " + o);       
    }            
} 

@Override 
protected void process(List<String> messages) { 
    for (String message : messages) { 
     MyGlobalGUIConsole.addMessage(message); 
    } 
} 
的invokeLater中的SwingWorker
+0

@AvrDragon用法是錯誤的觀念,是有關從MyGlobalGUIConsole.addMessage()包裝內容到invokerLater(),而不是在SwingWorker的,因爲過程()可以正確通知EDT – mKorbel 2012-08-10 08:20:50