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
相关产品推荐
相关产品推荐

