Java Google Guava事件总线和Swing模态对话框

Java Google Guava事件总线和Swing模态对话框,java,swing,events,modal-dialog,guava,Java,Swing,Events,Modal Dialog,Guava,我正在探索Guava EventBus在Swing应用程序中的使用,到目前为止一切都很好,只有一个例外是与模态对话框相关的 当我的应用程序显示一个模态JDialog(我们称之为dialog1)并且事件由该对话框发布时,一切正常,这意味着这些事件立即被模态对话框内外的订阅者接收 但是,如果我的应用程序显示不同的模式JDialog(我们称之为dialog2),并且如果这个dialog2创建了前面提到的dialog1并以模式显示,dialog1发布的事件将排队,直到dialog1关闭,这样订阅者就不会

我正在探索Guava EventBus在Swing应用程序中的使用,到目前为止一切都很好,只有一个例外是与模态对话框相关的

当我的应用程序显示一个模态JDialog(我们称之为dialog1)并且事件由该对话框发布时,一切正常,这意味着这些事件立即被模态对话框内外的订阅者接收

但是,如果我的应用程序显示不同的模式JDialog(我们称之为dialog2),并且如果这个dialog2创建了前面提到的dialog1并以模式显示,dialog1发布的事件将排队,直到dialog1关闭,这样订阅者就不会立即收到它们

我不明白为什么它在第一种情况下运行良好,但在第二种情况下却不行

如果在这两种情况下都不起作用,我认为这将是由这种方式造成的 阻止模态对话框之外的其他内容。但由于第一个案例效果良好,因此 我很困惑

任何提示都将不胜感激

干杯,
Christian

听起来像是说您打开了一个模式对话框(
dialog1
)来响应一个事件,然后该对话框上的操作将更多事件发布到同一个
EventBus
?在这种情况下,这就是
EventBus
在处理另一个事件时如何处理在同一线程上发布的事件的问题:它将事件排队,直到第一个事件的处理完成,以确保严格按照事件发布的顺序处理事件。它使用的模型通常假定事件处理代码不会无限期地占用线程。

是的,谢谢,您一定是对的。解决这个问题的正确方法是什么?添加第二个事件总线实例来处理对话框中的事件?@user3576825:是的,如果您可以使用该
EventBus
注册任何需要侦听事件的内容,那么这将是一个解决方案。如果在第一个
EventBus
中注册了一些东西,需要在关闭对话框之前接收其中一些事件,那么这可能不起作用。据我所知,当订阅事件的所有方法都已运行时,EventBus将事件视为已调度。对吗?如果是,那么我认为使用EventQueue.invokeLater()在事件处理方法中启动长时间运行的东西是明智的。对的我还想知道除了Javadocs和其他东西之外,是否还有EventBus的文档。有吗?@user3576825:我过去在Swing中使用
EventBus
时实际上是使用
AsyncEventBus
,给它一个调用
EventQueue.invokeLater()
Executor
。这可能是最好的解决方案:
AsyncEventBus
根本不存在排队问题,而且它还有一个很好的特性,即确保从后台线程发布的事件在事件队列上得到处理,从而允许UI工作正常。是的,这是关于
EventBus
的文档。