JavaFX切换场景后全屏模式失效问题求助
解决JavaFX场景切换后全屏失效的问题
我之前也碰到过一模一样的问题,咱们来一步步拆解原因并修复:
问题根源
你的代码里有两个核心问题导致全屏状态丢失:
- FXML布局的尺寸限制:两个FXML文件里的
AnchorPane都设置了maxHeight="-Infinity"和maxWidth="-Infinity",这会强制布局只能停留在prefHeight和prefWidth设定的400x600固定尺寸,哪怕窗口是全屏,内容也只会缩在小区域里,看起来就像全屏失效了。 - 冗余的场景创建操作:你每次切换场景都重新实例化
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
相关产品推荐
相关产品推荐

