2014-04-26 6 views
2

모범적 인 대화 상자와 관련된 한 가지 예외를 제외하고는 Swing 응용 프로그램에서 Guava EventBus의 사용을 탐색 중이며 지금까지는 문제가 없습니다.Google Guava Eventbus 및 스윙 모달 대화 상자

내 응용 프로그램이 모달 JDialog (dialog1이라고 부름)를 표시하고 이벤트가이 대화 상자에 게시되면 모든 것이 잘되므로 모달 대화 상자 안팎의 가입자가 이러한 이벤트를 즉시 수신한다는 의미입니다.

내 응용 프로그램이 다른 모달 JDialog (dialog2라고 부름)를 표시하고이 dialog2가 앞에서 설명한 대화 상자 1을 만들고 모달로 표시하면 dialog1이 게시 한 이벤트가 dialog1이 닫힐 때까지 대기하므로 구독자 즉시 접수하지 마십시오.

왜 첫 번째 경우에는 제대로 작동하지만 두 번째에는 제대로 작동하는지 이해할 수 없습니다.

두 경우 모두 작동하지 않으면 모달 대화 상자 밖에서 다른 것들을 차단하는 모달 에 의해 발생한다고 생각합니다. 하지만 첫 번째 사례가 잘 작동하므로 혼란 스럽습니다.

힌트를 보내 주시면 감사하겠습니다.

건배, 기독교

답변

0

당신이 이벤트에 대한 응답으로 모달 대화 (dialog1)를 엽니 말을하는지, 그리고 그 대화에 대한 작업이 동일한 EventBus에 더 많은 이벤트를 게시처럼 소리? 이 경우 다른 이벤트를 처리하는 동안 동일한 스레드에 게시 된 이벤트를 EventBus이 처리하는 방법과 관련된 문제입니다. 첫 번째 이벤트 처리가 완료 될 때까지 대기열에 넣어 이벤트가 게시 된 순서대로 엄격하게 처리되도록합니다. 일반적으로 사용하는 모델은 이벤트 처리 코드가 스레드를 무기한으로 묶지 않는다고 가정합니다.

+0

네, 감사합니다. 이 문제를 해결하는 올바른 방법은 무엇입니까? 대화 상자 내의 이벤트를 처리하는 두 번째 이벤트 버스 인스턴스를 추가 하시겠습니까? – user3576825

+0

@ user3576825 : 네, 그게'EventBus'로 이벤트를 듣기 위해 필요한 것을 등록 할 수 있다면 한가지 해결책이 될 것입니다. 대화 상자가 닫히기 전에 이러한 이벤트 중 일부를 수신해야하는 첫 번째'EventBus'에 등록 된 것이 있으면 작동하지 않을 수 있습니다. – ColinD

+0

내가 이해하는 한, EventBus는 이벤트에 가입 한 모든 메소드가 실행될 때 이벤트를 전달한 것으로 간주합니다. 그 맞습니까? 그렇다면 EventQueue.invokeLater()를 사용하여 이벤트 처리 메소드에서 장기 실행 항목을 시작하는 것이 현명하다고 가정합니다. 옳은? Javadocs와 다른 것들을 제외하고 EventBus에 관한 문서가 있는지 궁금하다. https://code.google.com/p/guava-libraries/wiki/EventBusExplained. 있어요? – user3576825