java swing 中的渲染问题
Rendering issue in java swing
我在 ubuntu 16.04 中使用 jre 1.7 有一个带有 GUI 运行 的 java 应用程序,我遇到了一些渲染问题。以下代码不是应用程序代码,而是一个简单的测试用例。
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 元素中。
关于这个的任何想法。
提前致谢。
我遇到了和你一样的问题,我设法通过使用 Oracle Java JDK 7 来摆脱这个相当恼人的错误OpenJDK 7 似乎有上述问题。
对我来说,只要将鼠标悬停在 JComboBox
中的不同选择上,这个问题就很明显了。我在使用 Windows 时没有遇到这个问题,所以我认为 Java JDK 的切换版本可能会产生不同的结果。
错误可能位于 OpenJDK 中 Swing 重绘函数内部的某处,因为重绘似乎是在错误的线程中执行的。
通过扩展 RepaintManager
class 并使用 java.awt.EventQueue.isDispatchThread()
的附加打印覆盖 addDirtyRegion(JComponent c, int x, int y, int w, int h)
,我可以检查重绘期间使用的线程。
上面的函数在使用 OpenJDK 悬停在 JComboBox
内部时多次返回 false 但 true使用 Oracle JDK 时。我希望比我聪明的人可以准确地找出错误并报告它,因为我没有时间弄清楚或在 JDK 实现之间进行源代码比较。
P.S。目前在 Ubuntu 使用 APT 安装 Oracle JDK 7 似乎有问题,所以我下载了 RPM 包,使用此方法使用 alien 将其转换为 deb 包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation
我在 ubuntu 16.04 中使用 jre 1.7 有一个带有 GUI 运行 的 java 应用程序,我遇到了一些渲染问题。以下代码不是应用程序代码,而是一个简单的测试用例。
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 元素中。
关于这个的任何想法。 提前致谢。
我遇到了和你一样的问题,我设法通过使用 Oracle Java JDK 7 来摆脱这个相当恼人的错误OpenJDK 7 似乎有上述问题。
对我来说,只要将鼠标悬停在 JComboBox
中的不同选择上,这个问题就很明显了。我在使用 Windows 时没有遇到这个问题,所以我认为 Java JDK 的切换版本可能会产生不同的结果。
错误可能位于 OpenJDK 中 Swing 重绘函数内部的某处,因为重绘似乎是在错误的线程中执行的。
通过扩展 RepaintManager
class 并使用 java.awt.EventQueue.isDispatchThread()
的附加打印覆盖 addDirtyRegion(JComponent c, int x, int y, int w, int h)
,我可以检查重绘期间使用的线程。
上面的函数在使用 OpenJDK 悬停在 JComboBox
内部时多次返回 false 但 true使用 Oracle JDK 时。我希望比我聪明的人可以准确地找出错误并报告它,因为我没有时间弄清楚或在 JDK 实现之间进行源代码比较。
P.S。目前在 Ubuntu 使用 APT 安装 Oracle JDK 7 似乎有问题,所以我下载了 RPM 包,使用此方法使用 alien 将其转换为 deb 包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation