从 JRE 7 或 8 升级到 JRE11 后,Java Swing JFrame 大小不同。如何使帧大小保持一致?
Posted
技术标签:
【中文标题】从 JRE 7 或 8 升级到 JRE11 后,Java Swing JFrame 大小不同。如何使帧大小保持一致?【英文标题】:Java Swing JFrame size different after upgrade to JRE11 from JRE 7 or 8. How can I make the frame size consistent? 【发布时间】:2021-02-05 21:03:42 【问题描述】:我帮助维护一个大型的、非常古老的 Swing 项目。我们注意到在 JRE 11 下运行的 Swing 项目页面看起来与在 JRE 8(我们之前的版本)下运行的 Swing 项目有很大不同。
我一直在探索这个问题。我注意到的一件事是基本尺寸似乎不同。 JRE11 使所有 JFrame 更大。我们需要保持大小一致。
这是一个小程序来演示我所看到的:
import javax.swing.*;
public class JustAFrame
public static void main(String[] args)
SwingUtilities.invokeLater(
() ->
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
frame.pack();
frame.setSize(400, 500);
frame.setVisible(true);
);
我使用 java 64 位版本 jdk1.8.0_241 在同一台 Windows 10 机器上运行该程序,并且 zulu11.41.23-ca-fx-jdk11.0.8-win_x64。 我附上了一张图片,显示了在两个 java 版本中并排运行的同一个类。 JRE 11 版本似乎大了大约 50%。 我可以做些什么来使 JRE 11 JVM 使我们的 JFrame 的大小与我们以前的 java 版本一样,而不必进入我们应用程序中的每个 JFrame 实例并摆弄 size Dimension 参数?
【问题讨论】:
看起来像一个错误...我无法在我的机器上重现它,您在代码中设置了大小。您是否在其他 OpenJDK 11 版本中尝试过? 显示分辨率缩放是否正在进行? “JRE 11 版本似乎大了大约 50%。” 在我看来不是这样。在任何情况下都不是 50%。为什么不通过打印java.version
和框架的大小(由运行它的 JRE 返回)和每次运行的内容窗格来固定它?顺便说一句,尝试并期望一致的帧大小是愚蠢的。重要的是,进行渲染的自定义组件大小一致,并且封装的框架适合它们。
@sb27:我刚刚尝试切换到另一个 java 版本。这个“Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode)”结果相同。
这肯定是由显示缩放引起的。 Pre java 8 一个单位的维度总是对应于屏幕上的一个像素。然而,java 9 添加了高 dpi 缩放,这导致一个单位对应于基于比例因子的多个像素。在您的情况下,您似乎正在使用 125% 缩放。因此框架更大。
【参考方案1】:
这是由于在 Java 9 之后,Windows scaling compatibility 工作正常。 这意味着如果您的监视器设置为 150%,则 Java 应用程序将缩放为 150%。要禁用此功能,请使用以下方法(在 zulu11 中为我工作)
设置虚拟机选项:-Dsun.java2d.uiScale=1.0
或
System.setProperty("sun.java2d.uiScale", "1.0");
1.0 = 100%
【讨论】:
以上是关于从 JRE 7 或 8 升级到 JRE11 后,Java Swing JFrame 大小不同。如何使帧大小保持一致?的主要内容,如果未能解决你的问题,请参考以下文章