如何让Swing/JavaFX应用适配多不同缩放因子的显示器?
解决方案:多显示器缩放叠加自定义UI Scale
一、Swing 部分处理
启用Per-Monitor DPI感知
先让Swing应用支持识别单显示器的独立缩放因子,在启动参数中添加:-J-Dsun.java2d.dpiaware=per-monitor -J-Dsun.java2d.uiScale.enabled=true计算并应用叠加缩放
通过GraphicsConfiguration获取当前显示器的系统缩放比例,再与自定义的uiScale(比如2)相乘,手动配置缩放:import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; // 获取当前显示器的系统缩放因子(1.25/1.5等) GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice().getDefaultConfiguration(); double systemScale = gc.getScaleX(); double customScale = 2.0; double finalScale = systemScale * customScale; // 在UI初始化前设置全局缩放 System.setProperty("sun.java2d.uiScale", String.valueOf(finalScale));若需要支持窗口跨显示器动态调整,可监听窗口
componentMoved事件,重新获取当前显示器的缩放因子并更新配置。注意事项
- 不要同时设置固定
sun.java2d.uiScale值和dpiaware=per-monitor,否则会覆盖显示器缩放感知。建议只启用dpiaware=per-monitor,再通过代码叠加自定义缩放。 - 检查NetBeans平台的
netbeans.options.screen.scaling配置项,设置为auto可兼容系统DPI识别。
- 不要同时设置固定
二、JavaFX 部分处理
启用Per-Monitor DPI支持
JDK17中JavaFX默认支持多显示器缩放,避免设置-Djavafx.scale固定值,让框架自动识别系统缩放。叠加自定义Scale
通过Screen获取窗口所在显示器的输出缩放因子,设置Stage的缩放比例:import javafx.application.Application; import javafx.stage.Stage; import javafx.stage.Screen; public class MainApp extends Application { @Override public void start(Stage primaryStage) { double customScale = 2.0; // 获取窗口当前所在显示器的缩放因子 Screen screen = Screen.getScreensForRectangle(primaryStage.getX(), primaryStage.getY(), 1, 1).get(0); double systemScale = screen.getOutputScaleX(); double finalScale = systemScale * customScale; // 应用缩放 primaryStage.setScaleX(finalScale); primaryStage.setScaleY(finalScale); // 后续UI初始化逻辑... } // 监听窗口位置变化,跨显示器时更新缩放 private void updateScale(Stage stage) { double customScale = 2.0; Screen screen = Screen.getScreensForRectangle(stage.getX(), stage.getY(), 1, 1).get(0); double systemScale = screen.getOutputScaleX(); double finalScale = systemScale * customScale; stage.setScaleX(finalScale); stage.setScaleY(finalScale); } }为
Stage的xProperty和yProperty添加监听器,触发updateScale方法实现动态调整。
三、通用启动参数建议
结合Swing和JavaFX需求,推荐启动参数:
-J-Dsun.java2d.dpiaware=per-monitor -J-Dsun.java2d.uiScale.enabled=true -J-Djavafx.per-monitor-dpi=true
这些参数确保应用能正确识别多显示器的独立缩放,为自定义叠加缩放提供基础。
内容的提问来源于stack exchange,提问作者user13583700
相关产品推荐
相关产品推荐

