繁体   English   中英

Java 8,Swing和OSX:对话框使UI对鼠标无响应

[英]Java 8, Swing, and OSX: Dialogs make UI unresponsive to Mouse

好的,这是我公司的应用程序遇到的一个非常非常奇怪的问题。 我将尽力描述这一点。

首先,这是具有Swing UI的旧版应用程序。

其次,仅当使用Java 8编译和运行该问题时才会出现此问题。在Java 7及更低版本中,不会发生此问题。

因此,问题来了:当显示对话框(无模式或无模式)时,UI对鼠标单击无响应。 但是,真正疯狂的是UI没有冻结。 将鼠标悬停在某物上会像平常一样产生悬停突出显示。 完美接收键盘命令。 但是,单击鼠标不起作用。

这也仅在OSX上发生。 Windows和Linux没有这个问题。 我正在OSX El Capitan上运行它。

就代码示例而言,它影响了应用程序中的所有对话框。 JOptionPanes和JDialogs似乎无关紧要。 这是一个简单的JOptionPane声明:

int n = JOptionPane.showOptionDialog(mcContext.getMapperView(), "xPath of dropping target can't be evaluated" +
                        "\nPlease, select xPath for dropped node",
                        "xPath calculation for dropped node",
                        JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);

这段代码是在EventThread上调用的,所以我不认为这是线程问题。

我对此完全感到困惑。 到目前为止,我们已经通过在Java 7中编译和运行它来忽略了它,但是在某些时候,随着版本的发展,我们将需要更直接地处理此问题。

有人有想法么?

编辑:感谢您的SSCCE想法。 现在,我比以往任何时候都更加困惑。 当我进行快速的框架/对话框演示时,效果很好。 没有问题。 因此,我不知道应用程序中可能是什么原因造成的。 有什么好地方可以开始寻找吗?

编辑2:包装了SwingUtilities.invokeLater中的声明之一,它起作用了。 好吧...现在,罪魁祸首是什么? Java 8与Java 7仍必须进行编译。

编辑3:更怪异的行为。 我将IDE移到了与正在运行的应用程序不同的“桌面”上,并且在显示错误对话框时,无法切换到该桌面。 我可以切换到当前桌面上的任何应用程序,但不能切换到另一个桌面。

编辑4:所涉及的对话框是通过拖放操作触发的。 不确定是否有帮助,但是我确实使用sun.lwawt.macosx.CDragSourceContextPeer类在线程转储的后台看到了一个线程。

好吧,花了一段时间,但我想我找到了。 我发现OpenJDK帖子似乎非常清楚地描述了此问题。

https://bugs.openjdk.java.net/browse/JDK-8139393

不知何故,Java 8中OSX的Swing中的Swing中的Drag N Drop不会释放对MouseEvent或Listener的控制,因此,当显示模式对话框时,鼠标无法通过它获取新事件。 这是一个疯狂的愚蠢错误,但是确实存在。

解决方案是将我的代码包装在SwingUtilities.invokeLater(...)中。 通过使显示对话框的代码从拖放代码中异步执行,拖放操作就能够完成并释放其对鼠标连接的控制(由于缺乏更好的描述)。 和中提琴! 问题解决了。

感谢所有尝试提供帮助的人。 希望这篇文章对解决这个问题的其他人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM