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 からのみ開かれるようになります。