我们在开发者网站上发生了一个非常奇怪的错误,我们无法自行复制。
波兰的一位开发人员最近将他的Windows XP Service Pack 3机器升级到了4G的Ram 当他这样做时,他开始使用IBM JDK 1.5在java程序中遇到图形错误 此错误仅发生在IBM JDK 1.5中,而不是在任何其他版本中。
当您在表单上创建按钮或控件并将鼠标移到表单上时,问题就会出现。
我们有一个测试程序
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GraphicTest {
public static void main(String args[]) {
JFrame frame = new JFrame("GraphicTest");
frame.getContentPane().setLayout(new FlowLayout());
frame.setSize(200, 200);
JButton button = new JButton("Test button");
button.setVisible(true);
frame.getContentPane().add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
直接显示问题。
然而,当我将相同的Windows版本升级到Ram的4Gb时,我自己的机器上不会出现这个问题。
有没有人见过像这样的问题?
为了澄清这一点,这个问题只发生在IBM JDK 1.5上,只有当我们拥有4Gb的Ram时才会发生。它不会发生在任何其他版本的JDK上,如果我们将内存量减少到3 Gb,问题就会消失。
答案 0 :(得分:3)
尝试减少Windows图形驱动程序中的硬件优化(可通过扩展显示控制面板访问)。如果有问题的机器有一个使用主内存部分的板载图形适配器,那么升级RAM可能会暴露驱动程序中的问题(或者RAM甚至可能有问题)。
答案 1 :(得分:1)
首先要说明的一件事是:将Swing组件的使用限制在AWT事件调度线程(EDT)中。
public class GraphicTest {
public static void main(final String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
runEDT();
}
});
}
private static void runEDT() {
assert java.awt.EventQueue.isDispatchThread();
JFrame frame = new JFrame("GraphicTest");
...
我不知道为什么内存大小会很重要。也许它会影响某些时间。也许JVM决定它在服务器级机器上运行并以更积极的优化运行。
答案 2 :(得分:1)
只是为了排除硬件故障假设:让开发人员测试他的RAM。 Memtest86会这样做。
答案 3 :(得分:1)
我在拥有3.24 G内存的IBM盒子上有完全相同的东西:所有的swing应用程序都会显示 - 但是文本(在菜单,表单,按钮 - 看似无处不在)都是空白的。
在Sun JDK上运行的相同swing程序没有问题。
我将硬件加速从“完全”降低到“无”(在显示屏上的“高级”即插即用监视器设置中) - 使用英特尔(r)82865G显卡。
现在摆动应用程序工作正常。
好地方......