Swing Worker(스윙 워커)

SwingWorker

SwingWorker는 Java 프로그래밍 언어의 Swing 라이브러리를 위해 Sun Microsystems가 개발한 인기 유틸리티 클래스입니다.SwingWorker를 사용하면 이벤트 디스패치 스레드를 올바르게 사용할 수 있습니다.Java 6에서는 Swing Worker가 [1]JRE에 포함되어 있습니다.

1998년부터 2006년까지 호환되지 않는 비공식 버전의 SwingWorker가 여러 개 생성되었으며 Java 6 이전 버전에 대한 문서가 풍부하지 않도록 주의해야 합니다.

Java 6.0에서의 사용방법

이벤트 디스패치 스레드 문제

SwingWorker는 사용자 인터랙션이벤트 후에 시간이 걸리는 작업을 수행해야 하는 경우(예를 들어 JButton을 누를 때 큰 XML 파일을 해석하는 경우)에 편리합니다.가장 간단한 방법은 다음과 같습니다.

사적인 문서 문서; ... JButton 단추 = 신규 JButton("열린 XML"); 단추.add Action Listener(신규 액션 리스트너() {     @오버라이드     일반의 무효 실행한 액션(액션 이벤트 e) {         문서 = 로드 XML();     } }); 

이거면 될 것 같은데 아쉽게도loadXML()메서드는 메인 Swing 스레드(이벤트 디스패치스레드)와 같은 스레드로 호출되기 때문에 메서드가 실행되는 데 시간이 필요할 경우 이 시간 동안 GUI가 정지됩니다.

Swing Worker 솔루션

이 문제는 Java에만 국한된 것이 아니라 많은 GUI 모델에서 공통적으로 발생합니다. SwingWorker그럼 다른 백그라운드스레드에서 시간이 걸리는 작업을 실행하여 이 시간 동안 GUI의 응답을 유지하는 방법으로 문제를 해결할 수 있습니다.

작업자 생성

다음 코드는 SwingWorker를 정의하고 있습니다.SwingWorker는,loadXML()메서드 호출:

Swing Worker(스윙 워커) 작업자 = 신규 Swing Worker(스윙 워커)< >문서, 무효>() {     @오버라이드     일반의 문서 doInbackground(배경)() {         문서 intDoc = 로드 XML();         돌아가다 intDoc;     } }; 

작업자 실행

메소드를 사용하여 실행을 시작합니다.

결과 검색 중

결과는 메서드를 사용하여 얻을 수 있습니다.

Event Dispatch Thread를 호출하면 작업이 완료될 때까지 리펜트를 포함한 모든 이벤트가 처리되지 않으므로 긴 작업이 종료되기 전에 을 피해야 합니다.작업 완료 후 결과를 가져오려면 다음 두 가지 방법이 있습니다.

사적인 문서 문서; ... Swing Worker(스윙 워커)< >문서, 무효> 작업자 = 신규 Swing Worker(스윙 워커)< >문서, 무효>() {     @오버라이드     일반의 문서 doInbackground(배경)() {         문서 intDoc = 로드 XML();         돌아가다 intDoc;     }     @오버라이드     일반의 무효 다 했어요.() {         해라 {             문서 = 얻다();         } 또 만나 (중단됨예외. ex) {             ex.print Stack Trace(프린트 스택 트레이스)();         } 또 만나 (실행예외. ex) {             ex.print Stack Trace(프린트 스택 트레이스)();         }     } } 
  • worker 메서드를 사용하여 청취자를 등록합니다.리스너에게 워커 상태의 변경이 통지됩니다.

Complete Worker 예시

사적인 문서 문서; ... JButton 단추 = 신규 JButton("열린 XML"); 단추.add Action Listener(신규 액션 리스트너() {     @오버라이드     일반의 무효 실행한 액션(액션 이벤트 e) {         Swing Worker(스윙 워커)< >문서, 무효> 작업자              = 신규 Swing Worker(스윙 워커)< >문서, 무효>() {              @오버라이드             일반의 문서 doInbackground(배경)() {                 문서 intDoc = 로드 XML();                 돌아가다 intDoc;             }             @오버라이드             일반의 무효 다 했어요.() {                 해라 {                     문서 = 얻다();                 } 또 만나 (중단됨예외. ex) {                     ex.print Stack Trace(프린트 스택 트레이스)();                 } 또 만나 (실행예외. ex) {                     ex.print Stack Trace(프린트 스택 트레이스)();                 }             }         };         작업자.실행하다();     } }); 

이력: Java 6.0 이전 사용 현황

SwingWorker는 Java 6.0 이후 Java SE에만 속해 있습니다.Sun은 이전 JDK에서 사용할 수 있는 버전을 출시했지만 Java SE의 일부가 아니어서 표준 라이브러리 [2]문서에는 언급되지 않았습니다.이러한 최신 버전은 2003년 이후이며 SwingWorker [3]버전3이라고 불리는 경우가 많습니다.유감스럽게도 JDK 6.0 SwingWorker와 버전3 SwingWorker는 다른 메서드명을 사용하여 호환되지 않습니다.Java 6 이전 버전에는 백포트 버전(아래 참조)이 권장됩니다.

SwingWorker 3을 인스턴스화하는 예를 다음에 나타냅니다.

Swing Worker(스윙 워커) 작업자 = 신규 Swing Worker(스윙 워커)() {     일반의 물건 건설하다() {         ... //백그라운드 스레드 코드 추가     }     일반의 무효 끝났습니다() {         ... //여기에 추가한 코드는 UI 스레드에서 실행됩니다.     }  }; 작업자.개시하다();  //백그라운드 스레드 시작 

start()method는 construct() 메서드에 추가된 코드를 별도의 스레드로 실행합니다.백그라운드 스레드가 종료되었을 때 알림을 받으려면 다음 명령을 덮어쓰기만 하면 됩니다.finished()방법.construct()메서드는 나중에 SwingWorker를 사용하여 가져올 수 있는 결과를 반환할 수 있습니다.get()방법.

Java 6 Swing Worker 백포트

Java 6 SwingWorker에서 Java 5로의 백포트는 [permanent dead link]http://swingworker.java.net/ 에서 구할 수 있습니다.패키지명 이외(org.jdesktop.swingworkerJava 6 Swing Worker 와 호환성이 있습니다.

등가물

「 」를 참조해 주세요.

레퍼런스

  1. ^ SwingWorker
  2. ^ 를 참조해 주세요.javax.swingJ2SE 6.0 이전이후 패키지 요약.또한 버전 6.0: [1], [2]까지는 문서의 인덱스 페이지에 SwingWorker 클래스가 표시되지 않습니다.
  3. ^ 다운로드 할 수 있습니다."SwingWorker 3". Internet Archive. Archived from the original on June 26, 2012.

외부 링크