2010-02-18 6 views
5

SwingWorker이 내 기본 GUI 내에서 중첩 된 클래스 여야하는지 궁금합니다. 차라리 내 프로그램 논리에서 GUI를 명확하게 유지하기 위해 외부 클래스로 만들 것입니다.SwingWorker는 중첩 클래스 여야합니까?

SwingWorker 클래스를 외부로 만들려고했는데 불행하게도 SwingWorker 클래스에서 내 GUI 필드에 액세스 할 수 없습니다. 레이블이나 SwingWorker의 done() 메서드에서 가져온 것과 같은 속성에 액세스하려고 할 때마다 nullPointer 예외가 발생합니다.

모든 조언을 주시면 감사하겠습니다.


우선 Jeff 대단히 감사합니다! 비록 두 번째 옵션으로 당신을 따라갈 수는 없지만 지금까지 잘 작동합니다. 내 백그라운드 작업 중 하나가 특정 크기 (긴 값)를 계산하므로 내 GUI에서 해당 값을 가져 오는 것이 좋습니다.

getter 및 setter를 사용하도록 제안했지만 불행히도 SwingWorker 클래스에서 구현하는 방법에 대해서는 잘 모릅니다.

나는 이런 식으로 시도 :

public void setSize(long totalSize) { 
    this.totalSize = totalSize; 
} 
public long getTotalSize() { 
    return totalSize; 
} 

세터는 doInBackground() 방법의 끝에서 호출됩니다. 불행히도 내 GUI에서 get() 메서드를 사용할 수 없습니다.

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

생성자에 Runnable 개체가 필요하므로 "w"개체 생성이 작동하지 않습니다. 내가 빠진 것이 있습니까? 제발 쉬워 져요, 제가 SwingWorker와 함께 일하는 것은 처음입니다. :) 다시 한 번 도움을 주셔서 감사합니다.

답변

6

외부 클래스로 SwingWorker를 만들 수 있습니다. 그러나 다른 클래스와 마찬가지로 변수 (예 : 설정하려는 레이블)를 볼 수없는 경우 물론 설정할 수 없습니다. 당신이 할 수있는 한 가지는 작업자가 완료 될 때 실행되는 Runnable을 전달하는 것입니다.

public class MySwingWorker extends SwingWorker { 

    private final Runnable r; 
    public MySwingWorker(Runnable r) { 
     this.r = r; 
    } 
    public void doInBackground() {...} 
    public void done() { r.run(); } 
} 

이제 GUI에서, 당신은 가능하지만 당신의 SwingWorker의 결과를 사용하려는 경우이 조금 난이도가 도착

Runnable updateLabel = new Runnable() { 
     public void run() { 
      label.setText("myValue"); 
     } 
}; 
SwingWorker w = new MySwingWorker(updateLabel); 
w.execute(); 

같은 일을 할 수 있습니다. 오히려 스윙 노동자의 생성자에 실행 가능한을 전달하는 대신, 같은 당신이 setter 메소드있을 것입니다 후가 될 것이다 : 어느 경우

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

을 실행 가능한 실행되는 폐쇄 유사하게 작동 할 때 노동자 은 끝났어.

+0

단순히 실행 가능이 아니라 생성자에서 Label을 전달하는 것도 가능합니다. 각각의 작은 액션을위한 새로운 worker 서브 클래스를 정의하는 것은 아마도 과잉 일 것이다. 익명 클래스는 매우 작고 단단히 결합 된 객체를 함께 묶는이 특정 문제를 해결할 때 유용합니다. –

+0

이것은 하나의 유스 케이스인지에 따라 달라집니다. 추상화는 여러 곳에서 작업하는 경우 효과적입니다. 오 얼마나 폐쇄 도움이 될 것입니다. –