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修复吧
我的 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修复吧