【问题标题】:Java 8, Swing, and OSX: Dialogs make UI unresponsive to MouseJava 8、Swing 和 OSX:对话框使 UI 对鼠标无响应
【发布时间】: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,我会看看我能做什么。

标签: java macos swing


【解决方案1】:

好的,花了一些时间,但我想我找到了。我发现一篇 OpenJDK 帖子似乎非常清楚地描述了这个问题。

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

不知何故,Java 8 中 OSX 上的 Swing 中的 Drag N Drop 并未释放其对 MouseEvent 或 Listener 的保留,因此当显示模式对话框时,鼠标无法获取新事件。这是一个疯狂愚蠢的错误,但它就在那里。

解决方案是将我的代码封装在 SwingUtilities.invokeLater(...) 中。通过让显示对话框的代码与拖放代码异步执行,拖放操作能够完成并释放它对鼠标连接的保持(因为缺乏更好的描述)。还有中提琴!问题解决了。

感谢所有试图提供帮助的人。希望这篇文章可以帮助其他处理此问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多