4

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

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 不显示内容(不包括代码示例,因此很难知道它是否是同一个错误)

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

4

1 回答 1

5

在 Windows Vista 和 XP(可能也在 Win7)上运行的 Java 1.5 到 Java 7 上似乎可以重现此错误

查看此错误报告(错误 ID:6859086)

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

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

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