2010-03-30 4 views
3

'이벤트 발송 스레드'에 대한 질문이 있습니다. 메인 클래스는 JFrame입니다. 코드의 나머지 구성 요소를 초기화하며 일부는 스윙을 포함하지 않으며 일부는 수행합니다. 충분히 간단하게 다음과 같이 동부 서머 타임을 사용하여 메인 클래스를 초기화? ...이벤트 발송 스레드 처리

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new Main(); 
     } 
    }); 
} 

모든 이벤트 디스패처 스레드에서 실행됩니다 이런 식으로하는 것입니다.

+0

올바른 이름은 Event Dispatch Thread입니다. 제목과 게시물을 수정하십시오. –

답변

6

일반적으로 계산, 데이터 수집 등을 위해 백그라운드 스레드를 사용하기 시작할 때까지는 충분합니다. 그런 다음 스윙 구성 요소 또는 모델을 변경하기 전에 EDT에 있는지 확인해야합니다.

당신이 동부 서머 타임에 실행하고 있는지 당신은 테스트 할 수 있습니다 또한

if (SwingUtilities.isEventDispatchThread()) { 
     // Yes, manipulate swing components 
    } else { 
     // No, use invokeLater() to schedule work on the EDT 
    } 

, 동부 서머 타임

에 백그라운드 스레드 및 프로세스 결과에 일을 넘겨하는 방법에 대한 자세한 내용은 SwingWorker 클래스를 참조하십시오
+0

나중에 참조 할 때 필요할 것으로 확신합니다. 지금 내 응용 프로그램은 단일 스레드이므로 괜찮을 것입니다. 고맙습니다! – bcoughlan

2

이것이 방법입니다. 조심해야 할 것은, Swing 컴퍼넌트에 등록한 청취자가, 새로운 Thread를 생성할지 어떨지 (오랫동안 계산을 실시하는 경우가 많다)입니다. 이러한 새 스레드는 GUI 작업을 수행하려면 invokeLater을 사용해야합니다.

2

썬 튜토리얼의 모든 예제가 그 방법입니다. 이 방법으로 수행 된 이유에 대한 자세한 내용은 Concurrency에있는 스윙 튜토리얼의 섹션을 읽어보십시오.

1

Devon_C_Miller 님의 답변이 맞습니다. 이벤트 디스패치 스레드를 호출하는 지름길을 지적하고자합니다.

다음은 모든 스윙 애플리케이션을 시작하는 방법입니다.

import javax.swing.SwingUtilities; 

import com.ggl.source.search.model.SourceSearchModel; 
import com.ggl.source.search.view.SourceSearchFrame; 

public class SourceSearch implements Runnable { 

    @Override 
    public void run() { 
     new SourceSearchFrame(new SourceSearchModel()); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new SourceSearch()); 
    } 

} 

이름을 변경하기 만하면 모든 스윙 프로젝트에 복사 할 수 있습니다.