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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:03