我有一个java应用程序,使用jre 1.7在ubuntu 16.04中运行GUI,我遇到了一些渲染问题。以下代码不是应用程序代码,而是一个简单的测试用例。
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(400,200);
String[] s = {"test", "of", "rendering"};
JComboBox<String> cs = new JComboBox<>(s);
f.add(cs);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
以下图片显示了问题:我在JcomboBox中有3个元素,但是当我浏览(通过鼠标或键盘)时,元素的显示会发生变化(不应该发生)。问题也发生在Jtree元素中。
对此问题的任何想法。 提前谢谢。
答案 0 :(得分:2)
我遇到了和你一样的问题,我设法通过使用 Oracle Java JDK 7 而不是 OpenJDK 7 来摆脱这个相当恼人的错误有上述问题。
对我而言,只需将鼠标悬停在JComboBox
中的不同选项上,就会出现问题。我没有使用Windows的这个问题,所以我认为Java JDK的切换版本可能会给出不同的结果。
错误可能位于OpenJDK中Swing重绘函数内部的某处,因为重绘似乎是在错误的线程中执行的。
通过使用RepaintManager
添加的打印扩展覆盖addDirtyRegion(JComponent c, int x, int y, int w, int h)
的{{1}}类,我可以检查重绘期间使用的线程。
使用Oracle JDK时,使用OpenJDK在java.awt.EventQueue.isDispatchThread()
内部停留时,上述函数多次返回 false ,而 true 。我希望比我聪明的人可以准确地指出错误并报告它,因为我没有时间弄清楚它或者在JDK实现之间进行源代码比较。
P.S。在使用APT的Ubuntu上安装Oracle JDK 7时似乎存在问题,所以我下载了RPM包,使用此方法将其转换为使用alien的deb包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation