Java如何正确获取屏幕几何参数及屏幕旋转方向
问题解答
关于屏幕方向获取和getBounds()的可靠性
首先给出明确结论:getDefaultConfiguration().getBounds()确实是更优的实现方式。
从你提供的两组输出可以明确看出:getDisplayMode()返回的是屏幕面板的原生物理分辨率,不会计入系统层面设置的旋转、缩放等变换规则;而getBounds()返回的是当前显示服务(X11/Wayland)给到应用层的实际可用逻辑画布尺寸,已经包含了旋转后的尺寸校正,你UMPC上返回的1280x720刚好就是你期望的正确横屏尺寸。
屏幕方向的可靠获取方案有两种:
- 方案1(纯Java跨平台,无需调用系统命令):对比
getDisplayMode()和getBounds()的宽高比例即可判断方向:- 若两者宽高完全一致:无旋转(0°,原始方向)
- 若
displayMode宽 == bounds高且displayMode高 == bounds宽:已旋转90°/270°,横竖屏切换状态,你UMPC的输出刚好符合该特征,可直接通过该逻辑判断已发生旋转 - 若宽高都不一致但比例相同:存在显示缩放
- 方案2(Linux下可精准判断左旋/右旋):通过Java调用
Runtime.exec()执行xrandr命令,解析输出结果中的旋转标识:输出中对应显示设备行的left表示左旋90°,right表示右旋90°,inverted表示180°旋转,normal为原始方向。
附加问题:无需修改代码的校正参数
有对应的环境变量可以实现全局校正,对所有Java程序生效:
- 针对X11环境:设置
JAVA_TOOL_OPTIONS环境变量,添加Java系统参数强制读取XRandR的逻辑显示配置:
该环境变量会被所有JDK实例自动读取,不需要修改第三方程序的启动代码,就能让Java程序优先读取系统配置后的逻辑分辨率1280x720。export JAVA_TOOL_OPTIONS="-Dsun.java2d.xrandr=true" - 针对Wayland环境:如果JDK版本对Wayland旋转支持不完善,可以额外添加
GDK_BACKEND=x11环境变量,强制Java程序通过XWayland兼容层运行,即可继承X11的分辨率配置。
内容的提问来源于stack exchange,提问作者Eddward
相关产品推荐
相关产品推荐

