Toolkit.getScreenInsets方法始终返回主显示器Insets问题咨询
问题现象
开发可自适应多屏幕尺寸的窗口时,调用Toolkit.getDefaultToolkit().getScreenInsets(GraphicsConfiguration gc)方法时,无论传入哪台显示器的GraphicsConfiguration参数,返回的始终是主显示器的Insets值。
问题复现代码
public static void main(String[] args){ GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] screenDevices=ge.getScreenDevices(); for(int i=0;i<screenDevices.length;i++) { Rectangle2D b=screenDevices[i].getDefaultConfiguration().getBounds(); Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(screenDevices[i].getDefaultConfiguration()); System.out.println(screenDevices[i].getIDstring()+": "+insets.bottom); } }
根因说明
这是Windows平台JDK8及更早版本的已知实现Bug,同版本JDK在macOS、Linux平台无此异常。该版本JDK的getScreenInsets方法内部硬编码读取主显示器的边距参数,完全忽略了传入的GraphicsConfiguration对应的副屏配置,因此所有副屏查询返回的Insets都和主屏一致。
解决方案
- 优先选择升级JDK版本到9及以上,Oracle官方在JDK9中已经修复了该问题,原有代码无需修改即可正常获取各屏幕的Insets值。
- 若业务必须兼容JDK8及更低版本,可通过JNA调用Windows原生API
GetMonitorInfo获取每个显示器的工作区范围,用屏幕物理边界减去工作区边界即可计算得到对应方向的Insets值。 - 临时测试场景下,也可直接读取本地系统的屏幕显示配置,对各屏幕Insets做硬编码适配。
内容的提问来源于stack exchange,提问作者Slash by Zero
相关产品推荐
相关产品推荐

