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 内部时多次返回 falsetrue使用 Oracle JDK 时。我希望比我聪明的人可以准确地找出错误并报告它,因为我没有时间弄清楚或在 JDK 实现之间进行源代码比较。

P.S。目前在 Ubuntu 使用 APT 安装 Oracle JDK 7 似乎有问题,所以我下载了 RPM 包,使用此方法使用 alien 将其转换为 deb 包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation