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

我在一个针对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); } } }); } } 

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

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

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

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

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

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

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

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