我正在扩展桌面环境中使用Windows 10(64位)。主屏幕属于我的笔记本,原始分辨率为1920x1080。辅助屏幕是3840x2160分辨率的高DPI显示屏。后者位于笔记本电脑的右侧:
Configuration dialog of extended desktop
JAVA JDK是10.0.1。 对两个GraphicsDevice(==屏幕)使用getDisplayMode(),两种分辨率均可正确显示:
GraphicsDevice 1-displayMode:1920x1080x32bpp @ 60Hz
GraphicsDevice 2-displayMode:3840x2160x32bpp @ 30Hz
但是在读取屏幕边界时(GraphicsConfiguration.getBounds())...
GraphicsDevice 1-范围:java.awt.Rectangle [x = 0,y = 0,width = 1920,height = 1080]
GraphicsDevice 2-范围:java.awt.Rectangle [x = 960,y = -540,width = 1920,height = 1080]
...屏幕2给出的起点似乎不正确。 x = 960应该标记主屏幕(1)的垂直中心线,而不是辅助屏幕(位于笔记本计算机的右侧!)中任何内容的起点。
我怀疑这与JAVA在High-DPI显示器上的自动缩放有关。我通过GraphicsConfiguration.getDefaultTransform()。getScaleX()/ getScaleY()获得的缩放因子是:
getScaleX():2.000000,getScaleY():2.000000(<--- GraphicsDevice 2)
这解释了为什么就JAVA而言,我的High-DPI显示器的尺寸是原来的一半。为了获得可读的字体等,这是有意义的。 但是至少起点的x-x = 960,y = -540-似乎是错误的。相反,应该是x = 1920。
(顺便说一句,当次屏幕位于主屏幕下方时,会出现类似的问题(无论如何,我想这也是一个问题。然后我得到y = 540的边界。)