gpt4 book ai didi

Java 8、Swing 和 OSX : Dialogs make UI unresponsive to Mouse

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:30 25 4
gpt4 key购买 nike

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

首先,这是一个带有 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 中拖放 N 不会释放其对 MouseEvent 或 Listener 的控制,因此当显示模式对话框时,鼠标无法通过它获取新事件。这是一个疯狂愚蠢的错误,但它就在那里。

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

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

关于Java 8、Swing 和 OSX : Dialogs make UI unresponsive to Mouse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com