Java Swing中的渲染问题

4

我有一个在Ubuntu 16.04上使用JRE 1.7运行的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元素中。enter image description here 有什么想法吗?谢谢。

2
  1. 你展示的图片是你上面列出的简单情况的输出吗?(因为我想知道,尽管你提供了一个简单的例子,但你的原始代码中是否还有其他未在示例中捕获的内容)。
  2. 只有当JFrame非常小的时候才会发生这种情况吗?
- David Koelle
2
  1. 一个Java Swing/AWT GUI应该在EDT上启动。
  2. f.pack(); 应该保留,但它使之前的 f.setSize(400,200); 失去意义。
- Andrew Thompson
这是使用哪种外观和感觉? - Obicere
@david koelle 这张图片是提供的快照代码的输出结果。 - Mr. D
我刚在Windows 10上测试了这个,使用的是Java版本1.8.0_73,但无法重现此问题。这似乎是与外观或Java的Linux发行版内部某些特定内容有关。您是否有其他Java版本可供测试?您是否有其他可用的外观? - Obicere
@Obicere 我没有使用特定的外观和感觉,要重现错误需要进行多次点击。还没有在Windows上尝试过。 - Mr. D
1个回答

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),并添加java.awt.EventQueue.isDispatchThread()的打印输出,可以检查在重新绘制过程中使用的线程。
当使用OpenJDK时,上述函数在JComboBox中悬停时多次返回false,而在使用Oracle JDK时则返回true。希望比我更聪明的人能够精确定位错误并进行报告,因为我还没有时间来找出问题或进行JDK实现之间的源代码比较。
此外,目前在Ubuntu上使用APT安装Oracle JDK 7存在问题,因此我下载了RPM包,并使用alien将其转换为deb包,具体方法请参见此链接:Ubuntu Linux上的Oracle Java JDK 7 - 源代码或RPM安装

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接