簡體   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