2017-10-18 143 views
4

我有一个java应用程序,运行在ubuntu 16.04上,使用jre 1.7,我得到了一些渲染问题。下面的代码不是应用程序代码,而是一个简单的测试用例。java swing中的渲染问题

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

对此问题有任何想法。 在此先感谢。

+2

1.您是显示上面列出的简单案例的输出结果? (因为我想知道,尽管你是一个简单的例子,你的原始代码中还有其他的东西没有在这个例子中被捕获到)。 2.这只有在JFrame很小时才会发生? –

+2

1)应该在EDT上启动Java Swing/AWT GUI。 2)'f.pack();'应该被保留下来,但是它使得早期的'f.setSize(400,200)''不相关。 –

+0

这是什么样的感觉? – Obicere

回答

2

我有同样的问题,因为你,我设法通过甲骨文的Java JDK 7,而不是的OpenJDK 7这似乎是具有上述问题摆脱这种颇为愤怒的bug。

对我来说,只需将鼠标悬停在JComboBox的不同选择上即可。我没有使用Windows的这个问题,所以我认为Java JDK的切换版本可能会给出不同的结果。

该错误可能位于OpenJDK中Swing重绘函数内部某处,因为重绘似乎是在错误的线程中执行的。 通过扩展RepaintManager类覆盖addDirtyRegion(JComponent c, int x, int y, int w, int h)与添加打印出java.awt.EventQueue.isDispatchThread()我可以检查重新绘制过程中使用的线程。

上述功能使用Oracle JDK时使用的OpenJDK但真正JComboBox内徘徊时返回多次。我希望比我聪明的人可以精确地查明错误并报告错误,因为我没有时间计算它或者在JDK实现之间进行源代码比较。

P.S.目前在使用APT的Ubuntu上安装Oracle JDK 7时似乎存在问题,所以我下载了RPM软件包,使用此方法将其转换为使用外星人的deb软件包 - Oracle Java JDK 7 on Ubuntu Linux - Source or RPM Installation