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

如何让Swing/JavaFX应用适配多不同缩放因子的显示器?

解决方案:多显示器缩放叠加自定义UI Scale

一、Swing 部分处理

  1. 启用Per-Monitor DPI感知
    先让Swing应用支持识别单显示器的独立缩放因子,在启动参数中添加:

    -J-Dsun.java2d.dpiaware=per-monitor
    -J-Dsun.java2d.uiScale.enabled=true
    
  2. 计算并应用叠加缩放
    通过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事件,重新获取当前显示器的缩放因子并更新配置。

  3. 注意事项

    • 不要同时设置固定sun.java2d.uiScale值和dpiaware=per-monitor,否则会覆盖显示器缩放感知。建议只启用dpiaware=per-monitor,再通过代码叠加自定义缩放。
    • 检查NetBeans平台的netbeans.options.screen.scaling配置项,设置为auto可兼容系统DPI识别。

二、JavaFX 部分处理

  1. 启用Per-Monitor DPI支持
    JDK17中JavaFX默认支持多显示器缩放,避免设置-Djavafx.scale固定值,让框架自动识别系统缩放。

  2. 叠加自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:12:43