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

时间:2018-04-16 02:49:52

标签: java swing jframe java-9

我的Swing应用程序无法在Java 8和Java 9之间获得一致的外观。它没有使用布局管理器,因此所有组件都给出了确切的大小,但我发现使用Java 9运行,JFrame的标题获取不同的高度和状态栏未完全呈现。请参考随附的屏幕转储;它似乎是一个错误。

我还研究了如何用一个简单的演示程序重复它,发现它与布局管理器无关。似乎在调整大小后禁用了问题。请尝试附带的演示源代码。

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

-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]

屏幕转储:

Different title height with Java 9

示例程序:

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();
    }
}

1 个答案:

答案 0 :(得分:1)

这个问题被Java bug系统确认为:

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

让我们等一下修复错误。