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

JavaFX切换场景后全屏模式失效问题求助

解决JavaFX场景切换后全屏失效的问题

我之前也碰到过一模一样的问题,咱们来一步步拆解原因并修复:

问题根源

你的代码里有两个核心问题导致全屏状态丢失:

  1. FXML布局的尺寸限制:两个FXML文件里的AnchorPane都设置了maxHeight="-Infinity"和maxWidth="-Infinity",这会强制布局只能停留在prefHeight和prefWidth设定的400x600固定尺寸,哪怕窗口是全屏,内容也只会缩在小区域里,看起来就像全屏失效了。
  2. 冗余的场景创建操作:你每次切换场景都重新实例化Scene,还手动new控制器,这种方式不仅没必要,还容易破坏窗口的原有状态(包括全屏)。

修复步骤

第一步:修正FXML布局约束

把两个FXML文件中AnchorPane的尺寸限制属性调整为自适应窗口:

<!-- 修改后的sample.fxml关键部分 -->
<AnchorPane maxHeight="USE_COMPUTED_SIZE" maxWidth="USE_COMPUTED_SIZE" 
            minHeight="USE_COMPUTED_SIZE" minWidth="USE_COMPUTED_SIZE" 
            prefHeight="400.0" prefWidth="600.0" 
            xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">

sample2.fxml做完全相同的修改,让布局能跟随窗口大小自动扩展。

第二步:优化场景切换逻辑

不需要每次切换都新建Scene,直接替换现有场景的根节点即可,这样能完整保留窗口的全屏状态。同时避免手动实例化控制器,用FXMLLoader加载FXML时自动绑定控制器更可靠。

修改Controller类的nextScreen方法:

public void nextScreen(ActionEvent actionEvent) throws Exception {
    Stage stage = (Stage) next.getScene().getWindow();
    // 加载第二个场景的FXML并获取根节点
    Parent secondRoot = FXMLLoader.load(getClass().getResource("sample2.fxml"));
    // 直接替换当前场景的根节点,无需新建Scene
    next.getScene().setRoot(secondRoot);
    // 保险起见再次确认全屏状态(其实窗口已经是全屏,这一步可省略)
    stage.setFullScreen(true);
}

修改SecondScreenController类的backScreen方法:

public void backScreen(ActionEvent actionEvent) throws Exception {
    Stage stage = (Stage) back.getScene().getWindow();
    // 加载第一个场景的FXML并获取根节点
    Parent firstRoot = FXMLLoader.load(getClass().getResource("sample.fxml"));
    // 替换当前场景的根节点
    back.getScene().setRoot(firstRoot);
    stage.setFullScreen(true);
}

最后可以删掉两个控制器里的start方法,因为现在完全用不到它们了,Main类的start方法保持原样即可。

第三步:可选强化(确保布局全屏适配)

如果想让布局彻底铺满全屏,还可以给根节点绑定窗口的尺寸属性:

// 在加载FXML后添加这段代码
secondRoot.prefWidthProperty().bind(stage.widthProperty());
secondRoot.prefHeightProperty().bind(stage.heightProperty());

这样布局会完全跟随窗口的大小变化,不会出现留白。

测试效果

现在运行程序,点击Next按钮切换场景,你会发现全屏状态完全保留,第二个场景的内容会铺满整个屏幕;返回第一个场景时,全屏状态也不会丢失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:07