2012-08-10 2 views
4

스윙 작업자로부터 EDT와 상호 작용하는 일반적인 방법은 get() 메소드를 사용하는 것입니다. 난 그냥 수있는 대부분의 tutotials에서SwingWorker.inVokeLater()를 SwingWorker.doInBackground() 내부에서 사용해야합니까?

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

가 다시 EDT에 SwingWorker의에서 무언가를 얻을 수 반환 값을 사용하는 것이 좋습니다,하지만 :하지만 난 이런 긴 작업과 코드가

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

답변

9

당신이 할 수있는 SwingWorker에는 백그라운드 작업의 진행률을보고하기위한 메서드가 있습니다. publish()doInBackground()에서 호출하여 진행률을 게시하고 진행률을 표시하기 위해 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); 
    } 
} 
SwingWorker의에서 invokeLater의
+0

@AvrDragon 사용은 잘못된 개념이 아닌 SwingWorker의에)합니다 (invokerLater에 MyGlobalGUIConsole.addMessage()에서 내용을 포장에 관한 절차 때문에()에게 EDT를 알릴 수 있습니다. – mKorbel