2011-08-20 5 views
0

작업 스레드의 메시지를 Java의 GUI로 전달하는 방법은 무엇입니까? 안드로이드에서 핸들러와 메시지 클래스를 통해이 작업을 수행 할 수 있음을 알고 있습니다. 그러나 나는 자바에서 같은 것을 원한다. 미리 감사드립니다. Ranganath.tm작업 스레드에서 메시지를 Java GUI의 GUI로 전달하는 방법

+0

어떤 GUI 라이브러리가 의미합니까? 그것은 차이를 만든다. –

답변

2

GUI 구성 요소에 EventBus & MVP 디자인을 사용하는 것이 가장 좋은 방법이라고 생각합니다. "작업 스레드"는 버스로 전송하여 이벤트를 발생시키고 특정 이벤트 유형의 처리기 인 발표자에게이를 알립니다. 같은 디자인의

니스 설명을 여기에서 찾을 수 있습니다 : Is there a recommended way to use the Observer pattern in MVP using GWT?

... 질문은 GWT의 대답에 대해 비록 MVP에 따라 설계 모든 응용 프로그램에 적용 할 수있다.

3

스윙 구성 요소는 이벤트 발송 스레드에서만 액세스해야하므로 SwingUtilities.invokeLater을 사용해야합니다.

이 메소드의 javadoc에는, thread에 관한 Swing 튜토리얼에의 링크가 있습니다. 이 링크를 클릭하십시오.

public class SwingWithThread { 
    private JLabel label; 

    // ... 

    public void startBackgroundThread() { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        // simulate some background work 
        Thread.sleep(5000L); 
       } 
       catch (InterruptedException e) { 
        // ignore 
       } 

       // update the label IN THE EDT! 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         label.setText("Background thread has stopped"); 
        } 
       }); 
      }; 
     }; 

     new Thread(r).start(); 
    } 
} 
0

당신은 SwingWorker의 클래스를 사용할 수는이 사건을 해결하기 위해 설계 참조 이미 GUI 스레드에서 호출 중임

/** 
* InvokesLater if not already in the dispatch thread. 
*/ 
public static void safeInvokeLater(Runnable runnable) { 
    if (EventQueue.isDispatchThread()) { 
     runnable.run(); 
    } else { 
     SwingUtilities.invokeLater(runnable); 
    } 
} 
관련 문제