这是一个Swing Java 7渲染bug吗?

9

我做了一个简单的Swing应用程序。但是渲染表现出了一些问题。我是做错了什么还是它是一个bug?

这是一个只包含文本框、按钮和空列表的小JFrame。如果我先水平调整窗口大小,然后在文本框中输入,按钮就会突然消失。

以下是我的代码:

public class App extends JFrame {

    public App() {

        JTextField messageFld = new JTextField();
        JButton saveBtn = new JButton("Save");

        JPanel inputPanel = new JPanel(new BorderLayout());
        inputPanel.add(messageFld, BorderLayout.CENTER);
        inputPanel.add(saveBtn, BorderLayout.EAST);

        JList<Data> list = new JList<Data>();
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(inputPanel, BorderLayout.NORTH);
        panel.add(list, BorderLayout.CENTER);

        this.getContentPane().add(panel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Test application");
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new App();
            }
        });
    }

}

以下是几个截图:
  1. 启动时

    enter image description here

  2. 水平调整大小后

    enter image description here

  3. 在文本字段中输入字符后

    enter image description here

  4. 鼠标移到按钮上后

    enter image description here

我使用的是Windows 7、Java 1.7.0和Eclipse Indigo SR1。我使用了JDK 1.7.0.0,现已升级到JDK 1.7.0.10,但问题仍然存在。
当我打印系统属性时,结果如下:
System.out.println(System.getProperty("java.version"));
System.out.println(System.getProperty("java.runtime.version"));

> 1.7.0_01
> 1.7.0_01-b08

1
奇怪,无法复现(jdk7,vista) - kleopatra
我也使用jdk 1.7.0和Windows 7,"保存"按钮始终正确显示。 - toto2
无法在Eclipse Juno和Java 1.7.0-b147上复现,还尝试了不同的L&F(Nimbus,Metal,Motif,Windows)。 - user85421
这可能是图形驱动程序中的一个漏洞。我有一张ATI显卡,但没有这个问题。 - toto2
+1,这是一个 bug,对于 BorderLayout.EASTBorderLayout.LINE_END。将组件放置在其他任何位置都不会导致问题。因此看起来那个区域有问题 :-) - nIcE cOw
我遇到了完全相同的问题,使用的是JRE 1.7更新3,就像在我的问题中描述的那样。 - nIcE cOw
2个回答

8
如果问题是由图形驱动程序引起的,则设置以下系统属性之一可能有所帮助。不太确定这些属性在Java 7中是否仍受支持。
sun.java2d.d3d=false
sun.java2d.ddoffscreen=false
sun.java2d.noddraw=true

这解决了这个具体问题。但是当我添加更多组件时,我又遇到了类似的问题。 - Jonas
2
在我的JVM启动选项中设置-Dsun.java2d.d3d=false,为我解决了许多渲染错误:JDK7/Windows7。 - John
@wzberger,现在在JDK 1.8更新31和40中,表格组件也出现了同样的问题。尝试设置您建议的系统属性,但仍然无法解决问题。该问题类似于http://stackoverflow.com/questions/28876538/java-swing-component-rendering-issue-with-java-8-update-31?noredirect=1#comment46015550_28876538。 - Jeevanantham

1

我正在使用Eclipse Helios Service Release 2和Java 1.6,我没有遇到那个bug;它对我来说很好用。然而,它不允许我向JList添加参数...可能是因为我使用的是旧版本的Java...所以基本上在我的设置中,没有JList参数也可以工作...我不确定这是否会对您有所帮助,但这些是我的观察。


我在使用Java 1.6时也遇到了相同的“null结果”。我怀疑OP最好发布一个SSCCE,该演示从EDT启动GUI并将一些基本的Java版本属性转储到System.out - Andrew Thompson

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