如何让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
相关产品推荐
相关产品推荐

