JavaFX登录场景切换报错:BorderPane无法转换为FXMLLoader
JavaFX登录场景跳转类型转换错误修复
错误信息
class javafx.scene.layout.BorderPane cannot be cast to class javafx.fxml.FXMLLoader (javafx.scene.layout.BorderPane is in module javafx.graphics of loader 'app'; javafx.fxml.FXMLLoader is in module javafx.fxml of loader 'app')
错误原因
问题出在changeSceneWelcome方法的第一行:FXMLLoader loader = FXMLLoader.load(getClass().getResource(fxml));。
FXMLLoader.load()是静态方法,返回值是FXML文件对应的根节点(比如这里的BorderPane),而非FXMLLoader实例。强行将根节点赋值给FXMLLoader类型变量,直接触发类型转换异常。
修复后的代码
public class HelloApplication extends Application { private static Stage stg; public static void main(String[] args) { launch(); } @Override public void start(Stage stage) { try { stg = stage; stage.setResizable(false); Parent root = FXMLLoader.load(getClass().getResource("login.fxml")); stage.setTitle("Login"); stage.setScene(new Scene(root, 600, 340)); stage.show(); } catch (Exception e) { e.printStackTrace(); } } public void changeSceneWelcome(String fxml, String username) { try { // 1. 创建FXMLLoader实例,传入FXML资源路径 FXMLLoader loader = new FXMLLoader(getClass().getResource(fxml)); // 2. 调用实例的load()方法加载FXML,获取根节点 Parent pane = loader.load(); // 3. 从loader实例获取对应的控制器 AfterLoginController afterLoginController = loader.getController(); afterLoginController.welcomeName(username); stg.setResizable(false); stg.setTitle("Welcome!"); stg.setScene(new Scene(pane, 800, 600)); stg.show(); } catch (Exception e) { e.printStackTrace(); } } }
关键修复点
- 替换静态
FXMLLoader.load()调用为实例化FXMLLoader对象,才能后续获取控制器 - 必须先调用
loader.load()加载FXML内容,再调用loader.getController(),否则控制器会返回null - 确保FXML文件中已通过
fx:controller属性正确指定AfterLoginController
内容的提问来源于stack exchange,提问作者Colony
相关产品推荐
相关产品推荐

