【发布时间】:2016-03-25 03:26:19
【问题描述】:
好的,这是我们公司的应用程序遇到的一个非常非常奇怪的问题。我将尽我所能尝试并描述这一点。
首先,这是一个带有 Swing UI 的旧版应用程序。
其次,该问题仅在使用 Java 8 编译和运行时才会出现。对于 Java 7 及以下版本,不会出现此问题。
所以,问题是:当显示对话框(模式或非模式,无关紧要)时,用户界面变得对鼠标单击无响应。然而,真正疯狂的是 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 类的线程转储中有一个后台线程。
【问题讨论】:
-
你能为此写一个 SSCCE(简单、自包含、可编译的示例)吗?
-
还有任何相关的日志/堆栈跟踪(Java 甚至可能是 mac 控制台)?
-
对于日志/堆栈跟踪,没有抛出异常,应用程序日志输出正常,好像没有任何问题。至于SSCCE,我会看看我能做什么。