2011-02-17 6 views
1

EDT에서 실행을 차단하는 방법이 있습니까? 여전히 생생한 GUI가 있습니까?AWT 이벤트 디스패처 스레드 멀티 스레딩 스레드 스레드

setVisible (true)을 호출 할 때 JDialog/JOptionPane이 비슷한 것을 발견했습니다.

왜 내가 필요한가요?

내 클래스는 다음과 같은 인터페이스에 만족해야

interface Quitable { 
    boolean quit(); 
} 

내 클래스이 같은 구현이 필요 :

class MyApp implements Quitable { 
    ExecutorService executor = Executors.newCachedThreadPool(); 
    // ... 
    public boolean quit() { 
      FuturTask<Boolean> futureTask = new FutureTask<Boolean>(saveJob); 
      executor.execute(futureTask); 
      // TODO: keep gui vivid 
      boolean saveResult = futureTask.get(); 
      return saveResult; 
    } 
    // ... 
} 

을 나는 약간의 시간이 걸릴 수 있습니다 저장 프로세스의 결과를 (반환해야 실패 할 수도 있음). 아니면 다른 해결책을 제안 하시겠습니까? 어떤 아이디어 주셔서 감사합니다. ;)

답변

1

Dialog은 차단하는 동안 이벤트 루프를 실행합니다. 다시 칠하기 요청, 호출 이벤트 및 이벤트를 통해 대화 상자 창에 특정 이벤트를 허용하는 필터가 있습니다. 이 API는 공개되지 않습니다.

이 동작을 노출하기 위해 Dialog에 해킹 된 라이브러리 (Foxtrot, IIRC)가있었습니다.

필자는이 프로그램이 반드시 필요하지 않은 방식으로 프로그램을 구성 할 것을 강력히 제안합니다. 이벤트 중심의 조직이 아니라 절차 적입니다. 따라서 다른 스레드 (가능한 스레드 풀/executor 서비스 또는 GUI와 유사한 이벤트 루프)에 작업을 대기시킨 다음 java.awt.EventQueue.invokeLater으로 GUI를 업데이트하십시오.

+0

JDialog-Hack에 대한 프레젠테이션 : http://www.futuretek.com/presents/foxtrot/KeepingYourSwingApplicationsResponsiveUsingFoxTrot.ppt – Synox

1

JDialog는 EDT의 실행을 차단하지 않으며, EDT는 모달로 열릴 때 jDialog의 이벤트를 제외한 이벤트를 무시합니다.

종료 방법을 호출하기 전에 진행률 표시 줄을 모달로 표시하는 것이 좋습니다.