使用面板消息/解决方法时,Java 1.5 JOptionPane绘制错误?

eir*_*kke 4 java swing paint java-5

我在一个针对Java 1.5的应用程序中有一个带有自定义消息面板的JOptionPane.该面板包含JTextField等.每20个调用左右,对话框中的任何内容都不会被绘制(甚至不是OK/Cancel按钮).如果我将对话框从屏幕拖出并再次返回以强制重新绘制,则组件可以按预期显示,除了绘制问题之外,组件响应正常.这是我可以展示这个bug的最小例子:

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);
        }
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

这是Swing中一个众所周知的错误吗?有标准的解决方法吗?我无法找到正式的错误报告.该错误似乎不存在于Java 1.7中,但我的应用程序需要在较早的1.5上运行,我想找到适用于后者的解决方法.

相关:无模式JDialog没有显示内容(不包含代码示例,所以很难知道它是否是同一个bug)

我发现错误的特定Java版本是1.5.0_22.

now*_*waq 5

这个错误似乎可以在Java 1.5上运行,直到运行在Windows Vista和XP上的Java 7(可能也在Win7上)

看看这个错误报告(错误ID:6859086)

导致问题的最可能原因是GDI资源泄漏.查看是否可以使用任务管理器或进程资源管理器跟踪Java进程使用的GDI资源.

编辑:根据错误报告,解决方法不可用,但您可以尝试使用几个运行时选项:

  • -Dswing.handleTopLevelPaint=false
  • -Dsun.java2d.d3d=true

  • 然后点击这个答案,并通过点击http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235接受 (3认同)