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

JavaFX场景切换时如何保持全屏状态无闪烁

解决JavaFX场景切换时全屏闪烁的问题

我完全懂你说的那种短暂全屏退出的闪烁感——确实挺影响体验的。问题出在你替换Scene的逻辑上:当你调用stage.setScene(scene)时,新创建的Scene会使用FXML里定义的prefWidth和prefHeight(也就是400x600)作为初始尺寸,这会让Stage暂时跳出全屏状态,之后你再调用stage.setFullScreen(true)才切回去,这中间的间隙就是你看到的闪烁。

给你几个靠谱的解决方案,不用局限于同一个FXML文件:

方案1:让新Scene匹配当前Stage的全屏尺寸

在创建新Scene的时候,直接传入当前Stage的宽度和高度,这样新Scene一开始就和全屏状态的Stage尺寸一致,不会触发尺寸变化:

@FXML
void doSomething(ActionEvent event) throws Exception {
    Stage stage = (Stage) pane.getScene().getWindow();
    Parent parent = FXMLLoader.load(getClass().getResource("sample2.fxml"));
    // 用当前Stage的全屏尺寸创建新Scene
    Scene scene = new Scene(parent, stage.getWidth(), stage.getHeight());
    stage.setScene(scene);
    // 这里其实可以不用再调用setFullScreen(true),因为Stage的全屏状态没被改变
    // stage.setFullScreen(true);
    stage.show();
}

方案2:替换Scene的根节点(更推荐)

不要替换整个Scene,而是直接替换Scene里的根节点——这样Stage的全屏状态会完全保持,连尺寸变化都不会有,切换最流畅:

@FXML
void doSomething(ActionEvent event) throws Exception {
    Parent parent = FXMLLoader.load(getClass().getResource("sample2.fxml"));
    // 直接获取当前Scene,替换它的根节点
    pane.getScene().setRoot(parent);
}

这个方法的好处是完全不需要操作Stage的任何属性,全屏状态自始至终都不会被打断,而且性能也更好,因为不需要销毁和重建Scene对象。

额外提示

另外注意一下你的sample2.fxml里的控制器还是sample.Controller,如果两个FXML的逻辑不一样,最好给每个FXML单独写对应的控制器,避免逻辑混乱哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:35:41