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

如何让SwingUtilities.convertPointToScreen忽略Windows缩放获取正确坐标?

解决Windows多屏幕缩放导致Swing坐标转换错误的问题
  • 启用系统级高DPI感知
    Java 17对高DPI的默认处理逻辑和Java 11不同,需显式配置让JVM适配系统缩放。可以在启动程序时添加以下JVM参数:
    java -Dsun.java2d.dpiaware=true -Dsun.java2d.uiScale=1 YourMainClass
    或者在UI初始化之前通过代码设置:

    System.setProperty("sun.java2d.dpiaware", "true");
    System.setProperty("sun.java2d.uiScale", "1");
    

    这会强制Java使用系统原生的坐标转换规则,避免跨屏时的缩放偏差。

  • 基于屏幕设备的变换修正坐标
    不要手动计算逆变换,而是通过组件所在屏幕的默认图形变换来修正点击坐标:

    Point clickPoint = new Point(mouseEvent.getX(), mouseEvent.getY());
    GraphicsConfiguration config = component.getGraphicsConfiguration();
    AffineTransform screenTransform = config.getDefaultTransform();
    Point2D correctedPoint = screenTransform.inverseTransform(clickPoint, null);
    Point screenPoint = SwingUtilities.convertPointToScreen(
        new Point((int) correctedPoint.getX(), (int) correctedPoint.getY()),
        component
    );
    

    这种方式会自动适配当前屏幕的缩放比例,比手动处理更稳定。

  • 回退到Java 11的高DPI行为
    如果上述方法无效,可以尝试强制JVM使用Java 11的高DPI处理逻辑,添加启动参数:
    java -Djava.awt.highDPI=false YourMainClass
    注意:这会降低UI的缩放清晰度,仅作为临时解决方案。

内容的提问来源于stack exchange,提问作者Ben Janus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:09