在java swing中渲染问题

时间:2017-10-18 16:05:36

标签: java swing ubuntu-16.04

我有一个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元素中。 enter image description here

对此问题的任何想法。 提前谢谢。

1 个答案:

答案 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