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

JavaFX应用启动屏全屏缩放适配问题求助

JavaFX启动屏全屏适配:自动保持比例与居中

问题核心

当前固定倍数缩放、手动计算位置的方式仅适配特定分辨率,无法在全屏模式下自动维持启动屏元素的宽高比与相对位置。解决方案的核心是基于原始窗口尺寸的比例动态计算缩放值和坐标,彻底摆脱手动调整参数的需求。

实现步骤与代码修改

1. 定义基准尺寸,锁定原始比例

将非全屏状态的窗口尺寸设为基准,后续所有缩放逻辑都基于这个比例展开:

// 非全屏时的原始窗口尺寸,作为宽高比基准
private static final double ORIGINAL_WIDTH = 990;
private static final double ORIGINAL_HEIGHT = 525;

public static boolean fullscreen = false;
public static double WIDTH = ORIGINAL_WIDTH;
public static double HEIGHT = ORIGINAL_HEIGHT;
public static Pane pane = new Pane();

2. 动态更新窗口尺寸(适配全屏/非全屏)

改用屏幕可视区域(排除任务栏、dock等系统UI)获取全屏尺寸,同时同步更新窗口大小:

public static void updateWindowSize(boolean isFullscreen) {
    fullscreen = isFullscreen;
    if (fullscreen) {
        Screen screen = Screen.getPrimary();
        Rectangle2D visualBounds = screen.getVisualBounds();
        WIDTH = visualBounds.getWidth();
        HEIGHT = visualBounds.getHeight();
    } else {
        WIDTH = ORIGINAL_WIDTH;
        HEIGHT = ORIGINAL_HEIGHT;
    }
    // 保留底部25px给输入框
    pane.setPrefSize(WIDTH, HEIGHT - 25);
}

3. 重构启动屏元素的缩放与位置计算

不再手动设置固定比例的X/Y坐标,而是基于原始位置和窗口缩放比例动态计算,同时严格保持元素自身宽高比:

public static void StartScreen() {  
    pane.getChildren().clear(); // 切换状态时清空旧元素
    pane.setStyle("-fx-background-color: transparent;");
    
    Group sGroup = new Group();
    Image i = new Image("file:start/So7AA.png");

    // 计算窗口缩放比例:取宽、高缩放值的最小值,避免元素超出屏幕
    double scaleX = WIDTH / ORIGINAL_WIDTH;
    double scaleY = HEIGHT / ORIGINAL_HEIGHT;
    double elementScale = Math.min(scaleX, scaleY);

    // --- 处理半透明外层元素 ---
    ImageView outer = new ImageView(i);
    double outerOriginalSize = 550;
    double scaledOuterSize = outerOriginalSize * elementScale;
    outer.setFitWidth(scaledOuterSize);
    outer.setFitHeight(scaledOuterSize);
    outer.setOpacity(.3);
    // 按原始相对位置比例计算新坐标
    outer.setX((ORIGINAL_WIDTH / 4.75) * scaleX);
    outer.setY(-10 * scaleY);

    // --- 处理模糊印章元素 ---
    GaussianBlur gBlur = new GaussianBlur(); 
    gBlur.setRadius(50);
    ImageView sealBlur = new ImageView(i);
    double sealOriginalSize = 450;
    double scaledSealSize = sealOriginalSize * elementScale;
    sealBlur.setFitWidth(scaledSealSize);
    sealBlur.setFitHeight(scaledSealSize);
    sealBlur.setEffect(gBlur);
    sealBlur.setX((ORIGINAL_WIDTH / 3.83) * scaleX);
    sealBlur.setY(39 * scaleY);

    // --- 处理清晰印章元素 ---
    ImageView seal = new ImageView(i);
    seal.setFitWidth(scaledSealSize);
    seal.setFitHeight(scaledSealSize);
    seal.setX((ORIGINAL_WIDTH / 3.83) * scaleX);
    seal.setY(39 * scaleY);

    // 添加元素到容器
    sGroup.getChildren().addAll(outer, sealBlur, seal);
    pane.getChildren().add(sGroup);
}

4. 使用方式

切换全屏/非全屏状态时,先更新窗口尺寸,再重新渲染启动屏:

// 切换到全屏
updateWindowSize(true);
StartScreen();

// 切换回窗口模式
updateWindowSize(false);
StartScreen();

额外优化:用布局容器简化居中逻辑

如果希望元素直接居中显示,无需手动计算坐标,可以用StackPane代替普通Pane,元素会自动居中:

// 替换原Pane为StackPane
public static StackPane pane = new StackPane();

// 在StartScreen中,直接添加元素即可自动居中
pane.getChildren().add(outer);
// 只需设置缩放后的尺寸,无需计算X/Y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:55:19