Java 9 更改禁用调整大小后 JFrame 的默认标题高度

Java 9 changed default title height of JFrame after resizing is disabled

我的 Swing 应用程序无法在 Java 8 和 Java 9 之间获得一致的外观。它没有使用布局管理器,所以所有组件都被赋予了准确的尺寸,但我发现 运行 Java 9、JFrame的标题高度不同,状态栏没有完全渲染。请参阅随附的屏幕转储;看来这是一个错误。

我也研究过如何用一个简单的demo程序复现,发现跟layout manager没有关系。似乎在禁用调整大小后出现问题。请尝试附加的演示源代码。

我也尝试了以下参数,但它们没有帮助:

-Dsun.java2d.uiScale=1.0
-Dprism.allowhidpi=false

我的系统运行 Windows 10 1709 / Java 9.0.4:

D:\JavaEnv\J2SE9.X64\bin>java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

D:\JavaEnv\J2SE9.X64\bin>ver
Microsoft Windows [Version 10.0.16299.371]

屏幕转储:

示例程序:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.UIManager;

public class FirstFrame extends JFrame
{
    private static final long serialVersionUID = 1L;

    public FirstFrame()
    {
        JToolBar toolbar = new JToolBar();

        getContentPane().add(new JTextArea(), BorderLayout.CENTER);

        JToolBar statusbar = new JToolBar();

        statusbar.add(new JLabel("Status:"));
        getContentPane().add(statusbar, BorderLayout.SOUTH);

        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("File");
        menubar.add(menu);

        super.setJMenuBar(menubar);

        super.setTitle("Default Frame");

        // It seems that problem is here.
        setSize(new Dimension(300, 300));
        setResizable(false);

        super.setLocation(100, 100);
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        super.setVisible(true);
    }

    public static void main(String[] args) throws Exception
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

        new FirstFrame();
    }
}

此问题已被 Java 错误系统确认为错误:

JDK-8202015: JFrame.setResizable(false) gives different frame size & title height from Java 8

等bug修复吧