You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8与Java 17中GraphicsConfiguration结果差异原因咨询

Java 8与Java 17屏幕缩放相关API输出差异原因分析

测试代码

import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;

public class GraphicsEnvironmentTest {

    public static void main(String[] args) {
                
        GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice defaultScreenDevice = localGraphicsEnvironment.getDefaultScreenDevice();
        GraphicsConfiguration defaultConfiguration = defaultScreenDevice.getDefaultConfiguration();
        
        System.out.println("defaultConfiguration.getBounds() " + defaultConfiguration.getBounds());
        System.out.println("defaultConfiguration.getDefaultTransform() " + defaultConfiguration.getDefaultTransform());

    }

}

Java 8(版本1.8.0_242)运行输出

defaultConfiguration.getBounds() java.awt.Rectangle[x=0,y=0,width=2560,height=1600]
defaultConfiguration.getDefaultTransform() AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]

Java 17(版本Eclipse Adoptium - Temurin-17.0.7+7)运行输出

defaultConfiguration.getBounds() java.awt.Rectangle[x=0,y=0,width=1707,height=1067]
defaultConfiguration.getDefaultTransform() AffineTransform[[1.5, 0.0, 0.0], [0.0, 1.5, 0.0]]

问题

为何两者输出存在差异?这是否属于Bug?注:仅当操作系统屏幕缩放比例非100%时可复现该问题。

解答

这不是Bug,是Java跨版本对高DPI屏幕支持的行为变更导致的:

  • Java 8及更早版本默认不支持高DPI缩放,GraphicsConfiguration.getBounds()返回的是屏幕的物理像素尺寸,getDefaultTransform()的缩放因子始终为1.0,不受系统缩放比例影响。
  • Java 9及之后(包括Java 17)引入了高DPI感知支持,默认适配系统的屏幕缩放设置。此时getBounds()返回的是逻辑像素尺寸(物理像素 ÷ 系统缩放比例),getDefaultTransform()则返回对应该缩放比例的变换矩阵(示例中的1.5倍对应系统150%缩放)。

这种变更是Java官方有意的改进,目的是让Java应用在高DPI屏幕上显示更清晰,避免界面元素过小的问题。如果需要在Java 17中恢复Java 8的行为,可以通过设置系统属性-Dsun.java2d.uiScale=1来强制关闭缩放适配。

内容的提问来源于stack exchange,提问作者Holzmacher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:58:22