1

Java/Swing デスクトップ アプリケーション (Windows XP では Java 6u16) を使用していますが、これがハングしているように見えることがあります。実際に起こっているのは、アプリケーションがモーダル ダイアログを表示しているが、このダイアログがレンダリングされていないためです。ユーザーが Alt-Tab を使用してアプリケーションから切り替え、その後アプリケーションに戻った場合、ダイアログは正しくレンダリングされます。さらに、リモート ユーザーが NetOp (VNC/リモート デスクトップのようなもの) 経由でセッションに接続すると、GUI が正しく再描画されます。

アプリは JavaWebstart 経由で実行されます。DirectDraw が原因でレンダリングの問題が発生していると聞いたので、JNLP に以下を追加しました。

<property name="sun.java2d.noddraw" value="true"/>

しかし、問題はまだ発生します (私が正しく理解していれば、これにより DirectDraw と Direct3d が完全にオフになります: http://download.oracle.com/javase/1.5.0/docs/guide/2d/flags.html#noddrawを参照してください) 。

私はこれについてのアイデアがありません。どんな提案でも大歓迎です。

ありがとう、
フィル

編集...

JDialog を拡張し、他のすべてのダイアログを拡張する抽象ダイアログ クラスがあります。次のメソッドが含まれています。

public void showDialog() {      
    initKeyBindings();
    Application.getApplication().deactivateScannerListener();
    setVisible(true);
}

ダイアログを表示したいときはいつでも、showDialog() を呼び出します。initKeyBindings メソッドは ActionMap を設定しますが、2 行目はアプリケーション固有です (アプリケーションはシングルトンです。ダイアログが表示されている間は JPOS スキャナー リスナーを無効にしています)。

次のように、対応する hideDialog() メソッドがあります。

public void hideDialog() {      
    setVisible(false);
    Application.getApplication().activateScannerListener();
    dispose();
}

ありがとう、フィル

編集... 申し訳ありませんが、もう 1 つ編集します。すべてのダイアログには親があります。他の親が指定されていない場合、AbstractDialog クラスはデフォルトでメイン アプリケーション フレームになります。

参考までに、これに従っている人のために、コードに次を追加しました。

if (SwingUtilities.isEventDispatchThread()) {
        initialiseAndShowDialog();
} else {
    SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
               initialiseAndShowDialog();
            }
    });
}

これにより、ダイアログが EDT からのみ開かれるようになります。

4

1 に答える 1

2

どのスレッドからshowDialog()を呼び出していますか? Swing コンポーネントには、イベント ディスパッチ スレッドでのみアクセスする必要があります。

SwingUtilities.invokeAndWait() を試すことができ、それに渡されるRunnable引数は showDialog() を呼び出す必要があります。

問題が解決したかどうかをお知らせください。

于 2010-09-15T18:02:14.167 に答える