4

Java 1.5を対象としたアプリケーションに、カスタムメッセージパネルを含むJOptionPaneがあります。パネルには、特にJTextFieldが含まれています。20回程度の呼び出しごとに、ダイアログには何も表示されません([OK] / [キャンセル]ボタンも表示されません)。ダイアログを画面からドラッグして元に戻し、強制的に再描画すると、コンポーネントは期待どおりに表示され、ペイントの問題は別として、コンポーネントは正常に応答します。これが私がこのバグを示すために得ることができる最小の例です:

public class BugTest {
  public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        // The text field needs to be wrapped in a panel for the bug to show up.
        JPanel messagePanel = new JPanel();
        // A JLabel won't exhibit the bug, but a JTextField will.
        JTextField textField = new JTextField("Some content");
        messagePanel.add(textField);
        // Loop so we can keep clicking OK until the bug shows up.
        while (true) {
          int res = JOptionPane.showOptionDialog(null, messagePanel,
              "SomeTitle", JOptionPane.OK_CANCEL_OPTION,
              JOptionPane.PLAIN_MESSAGE, null, null, null);
        }
      }
    });
  }
}

これはSwingのよく知られたバグですか?標準的な回避策はありますか?このための公式のバグレポートを見つけることができませんでした。このバグはJava1.7には存在しないようですが、私のアプリケーションは古い1.5で実行する必要があり、後者で機能する回避策を見つけたいと思います。

関連:モードレスJDialogにコンテンツが表示されない(コード例が含まれていないため、同じバグかどうかを判断するのは困難です)

私がバグを見つけた特定のJavaバージョンは1.5.0_22です。

4

1 に答える 1

5

このバグは、WindowsVistaおよびXPで実行されているJava1.5からJava7まで(おそらくWin7でも)で再現できるようです。

このバグレポートをご覧ください(バグID:6859086)

問題の最も可能性の高い原因は、GDIリソースリークです。タスクマネージャーまたはプロセスエクスプローラーを使用して、Javaプロセスによって消費されるGDIリソースを追跡できるかどうかを確認します。

編集:バグレポートによると、回避策は利用できませんが、いくつかのランタイムオプションを試してみることができます。

  • -Dswing.handleTopLevelPaint=false
  • -Dsun.java2d.d3d=true
于 2011-12-05T21:08:36.917 に答える