2014-04-26 38 views
2

我正在探索在Swing應用程序中使用Guava EventBus,並且目前爲止所有工作都正常,只有一個與模式對話框有關的例外。Google Guava Eventbus和Swing Modal對話框

當我的應用程序顯示一個模態的JDialog(我們稱之爲dialog1)並且這個對話框發佈了事件時,一切都很好,這意味着這些事件會立即被模態對話框內外的訂閱者接收。

但是,如果我的應用程序顯示不同的模態JDialog(我們稱之爲dialog2),並且如果此dialog2創建上述dialog1並以模態方式顯示它,則dialog1發佈的事件將排隊等待,直到dialog1關閉爲止,不要馬上收到。

我不明白爲什麼它在第一種情況下可以正常工作,但不在第二種情況。

如果它在兩種情況下都不起作用,我會認爲這是由模態對話框外的阻塞其他東西的模態 造成的。但作爲第一個案件正常工作,所以我很困惑。

任何提示將非常感激!

乾杯, 基督教

回答

0

這聽起來像你說你在響應打開一個模式對話框(dialog1)一個事件,然後該對話框中的行動發佈更多的事件在同一EventBus?在這種情況下,這是一個問題,EventBus在處理另一個事件時如何處理在同一個線程上發佈的事件:它將它們排隊,直到完成第一個事件的處理,以確保嚴格按照發布的順序處理事件。它使用的模型通常假設你的事件處理代碼不會無限期地綁定線程。

+0

是的,謝謝,你一定是對的。什麼纔是解決這個問題的正確方法?添加第二個事件總線實例來處理對話框中的事件? – user3576825

+0

@ user3576825:是的,如果您可以註冊任何需要使用該「EventBus」偵聽事件的應用程序,那將是一種解決方案。如果在對話框關閉之前有事件需要在第一個「EventBus」中註冊,那麼這可能不起作用。 – ColinD

+0

所以,據我所知,EventBus認爲所有訂閱該事件的方法都運行時調度事件。那是對的嗎?如果是,那麼我認爲在EventQueue.invokeLater()事件處理方法中啓動長時間運行的東西是明智的。正確?我還想知道除了Javadocs和https://code.google.com/p/guava-libraries/wiki/EventBusExplained中的東西外,是否還有EventBus的文檔。有沒有? – user3576825