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

如何从FXML Controller内设置显示第二个Scene?编程新手求助

从第一个FXML控制器切换到第二个Scene的方法

嘿,作为刚学两周的新手能走到这一步已经超棒啦!冗余或者不规范的地方完全不用在意,谁都是从这个阶段过来的😉 下面我给你两种常见的实现方式,你可以根据需求选一种:

方式一:替换当前窗口的Scene(在同一个Stage中切换)

这种方式是把当前窗口的内容换成第二个Scene,适合不需要保留原窗口的场景。你可以在第一个控制器的按钮点击事件里这么写:

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;

public class FirstController {

    @FXML
    private void switchToMainCallWindow(ActionEvent event) {
        try {
            // 1. 获取当前的Stage(通过触发事件的控件往上找)
            Stage currentStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            
            // 2. 加载第二个FXML文件(注意路径要和你的文件位置匹配!)
            FXMLLoader loader = new FXMLLoader(getClass().getResource("mainCallWindow.fxml"));
            Parent secondSceneRoot = loader.load();
            
            // 3. 创建新Scene并替换当前Stage的Scene
            Scene mainCallWindowScene = new Scene(secondSceneRoot);
            currentStage.setScene(mainCallWindowScene);
            currentStage.setTitle("主呼叫窗口"); // 可选:给窗口设置标题
            currentStage.show(); // 其实这步可以省略,因为Stage本来就是显示状态的
        } catch (IOException e) {
            // 打印异常信息,方便你排查问题(比如FXML路径写错了)
            e.printStackTrace();
        }
    }
}

方式二:打开一个全新的Stage(新窗口)

如果你想保留原窗口,同时打开第二个Scene的新窗口,就用这种方式:

@FXML
private void openMainCallWindowAsNewStage(ActionEvent event) {
    try {
        // 1. 加载第二个FXML文件
        FXMLLoader loader = new FXMLLoader(getClass().getResource("mainCallWindow.fxml"));
        Parent secondSceneRoot = loader.load();
        
        // 2. 创建新的Stage并设置Scene
        Stage newStage = new Stage();
        newStage.setScene(new Scene(secondSceneRoot));
        newStage.setTitle("主呼叫窗口");
        newStage.show();
        
        // 可选:如果想关闭原窗口,取消下面这行的注释
        // ((Stage) ((Node) event.getSource()).getScene().getWindow()).close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

几个重要的注意点

  • FXML路径要正确:如果你的mainCallWindow.fxml和第一个控制器在同一个包下,直接写文件名就行;如果在子文件夹里,比如views/mainCallWindow.fxml,就要写完整的相对路径。
  • 控制器配置:如果第二个FXML有对应的控制器,要确保在FXML文件里通过fx:controller属性正确指定了控制器类的全路径。
  • 异常处理:一定要保留try-catch块,不然如果路径写错或者FXML文件有问题,程序会直接崩溃,而打印异常信息能帮你快速找到问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:50