我的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]
屏幕转储:
示例程序:
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();
}
}
答案 0 :(得分:1)
这个问题被Java bug系统确认为:
JDK-8202015: JFrame.setResizable(false) gives different frame size & title height from Java 8
让我们等一下修复错误。