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

JavaFX高DPI屏幕缩放显示异常及适配方案咨询

问题根源

JavaFX 8及更高版本默认开启系统DPI缩放适配特性,会跟随系统的缩放比例自动放大所有界面元素。如果你的布局里写死了固定像素尺寸,放大后就会出现内容超出屏幕边界的问题。

解决方案

方案1:强制关闭DPI自动缩放(快速修复当前问题)

直接通过系统属性配置,让JavaFX始终以100%比例渲染界面,不跟随系统缩放调整。在main方法的launch调用前添加以下配置即可:

public static void main(String[] args) {
    // Windows系统禁用缩放
    System.setProperty("glass.win.uiScale", "100%");
    // Linux系统禁用缩放
    System.setProperty("glass.gtk.uiScale", "100%");
    // macOS系统禁用缩放
    System.setProperty("glass.macos.uiScale", "100%");
    launch(args);
}

也可以在IDEA的运行配置VM选项中添加参数-Dglass.win.uiScale=100%,效果和代码配置一致。同时你原代码里的stage.sizeToScene()调用可以删除,设置最大化后该调用不会生效。

修改后的完整运行代码:

@Override
public void start(Stage stage) throws IOException{
    Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("hello-view.fxml")));
    Scene scene = new Scene(root);

    Screen screen = Screen.getPrimary();
    double dpi = screen.getDpi();
    double scaleX = screen.getOutputScaleX();
    double scaleY = screen.getOutputScaleY();

    System.out.println("DPI: " + dpi + " - scaleX: " + scaleX + " - scaleY: " + scaleY);

    stage.setTitle("JavaFX_Practice");
    stage.setScene(scene);
    stage.setMaximized(true);
    stage.show();
}

public static void main(String[] args) {
    System.setProperty("glass.win.uiScale", "100%");
    System.setProperty("glass.gtk.uiScale", "100%");
    System.setProperty("glass.macos.uiScale", "100%");
    launch(args);
}

方案2:调整布局适配不同缩放比例(推荐长期使用)

如果希望界面在不同DPI、不同缩放比例下都能正常显示,不会出现元素过小/过大的问题,需要调整布局规则:

  • 不要在FXML中给组件设置固定宽高像素值,尽量使用默认的自动计算尺寸,或者绑定父容器的宽高属性
  • 使用AnchorPane时给子组件设置四个方向的锚点,比如需要占满整个AnchorPane的组件,可将上下左右四个锚点值都设为0,子组件会自动跟随父容器缩放调整尺寸
  • VBox内需要拉伸的子元素可以设置vgrow属性为ALWAYS,让元素随容器高度自动拉伸

效果参考

100%缩放比例下窗口效果:
100%缩放效果
125%缩放比例下窗口效果:
125%缩放效果

内容的提问来源于stack exchange,提问作者Lenghak Hok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:07