2016-03-24 13 views
8

これは私の会社のアプリケーションで本当に本当に本当に本当に奇妙な問題です。私はできる限り最善の方法でこれを説明しようとしています。Java 8、Swing、およびOSX:ダイアログでUIがマウスに反応しなくなる

まず、これはSwing UIを備えたレガシーアプリケーションです。

第2に、この問題は、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の宣言のうちの1つをラップし、それが機能しました。 Ok ...今、何が原因でしょうか? Java 8がJava 7とは違ってコンパイルされていることが必要です。

編集3:より奇妙な動作です。 IDEを実行していたアプリケーションとは別の「デスクトップ」に移動し、バグのダイアログが表示されたら、そのデスクトップに切り替えることはできません。私は現在のデスクトップ上の任意のアプリケーションに切り替えることができますが、別のデスクトップには切り替えることはできません。

編集4:問題のダイアログがドラッグアンドドロップ操作によってトリガーされています。それが役立つかどうかはわかりませんが、sun.lwawt.macosx.CDragSourceContextPeerクラスを使用してスレッドダンプにバックグラウンドでスレッドがあることがわかります。

+2

SSCCE(シンプル、自己完結型、コンパイル可能な例)を書くことができますか? – fge

+0

関連するログ/スタックトレース(Javaと多分Macコンソールの両方)? – Mena

+0

ログ/スタックトレースでは、例外がスローされず、アプリケーションのログ出力には何も問題がないかのように正常に出力されます。 SSCCEについては、私ができることを見ていきます。 – user2223059

答えて

2

さて、時間がかかりましたが、私はそれを見つけたと思います。私はこの問題を非常にはっきりと説明しているようなOpenJDKの投稿を見つけました。

どういうわけか

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

、Javaの8でOSX上のスイングでNドロップのMouseEventまたはリスナーにその保留を解除していないドラッグし、モーダルダイアログが表示されたときにマウスが新しいイベントを取得することができませんそれを通って。それは狂ったばかげたバグですが、そこにあります。

解決策は私のコードをSwingUtilities.invokeLater(...)にラッピングしていました。ドラッグ・アンド・ドロップ・コードから非同期に実行されるダイアログを表示するコードを持つことにより、ドラッグ・アンド・ドロップ操作は完了し、マウス接続の保留を解放することができます(説明が不足しているため)。そして、ビオラ!問題が解決しました。

お手伝いをしてくださった皆様、ありがとうございます。この記事がこの問題に対処するのに役立つことを願っています。

関連する問題