从 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 大小不同。如何使帧大小保持一致?的主要内容,如果未能解决你的问题,请参考以下文章

jdk11和jdk1.8区别

为什么JRE 10过时且JRE 8是最新的?

jdk11中如何生成jre

安全加固-浅谈Tomcat升级

windows10 升级JDK和JRE

fastqc linux 下安装完成后运行提示如下,请高手帮忙看看,谢谢……