在针对 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/