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

标签 java swing paint java-5

在针对 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 上运行,我想找到适用于后者的解决方法。

相关:Modeless JDialog not showing contents (不包括代码示例,因此很难知道是否是同一个错误)

我发现该错误的具体 Java 版本是 1.5.0_22。

最佳答案

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

看看at this bug report (错误 ID:6859086)

The most likely cause of the problem is a GDI resource leak. See if you could track GDI resources consumed by the java process with either task manager or process explorer.

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

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

关于使用面板消息/解决方法时,Java 1.5 JOptionPane 绘制错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391554/

相关文章:

java - 尝试在模态对话框中更新 JLabel

java - Java Swing 中是否有 "Group Box"等效项?

java - 如何在java中的边框布局中嵌入网格布局

java - 处理拖放 : view or business logic?

java - 在 java 中绘制一个形状但在屏幕上保留最新的形状

java - 如何在 JScrollPane 之上绘制?

java - Android MultiTouch 仅适用于一根手指

java - 私有(private)成员变量变为 null

java - 正则表达式允许字符模式但不允许来自该模式的单个字符

qt - 如何在 QSpinBox 中绘制破折号而不是 null?