JavaFX getScene() returns null in initialize method of the controller

后端 未结 2 542
傲寒
傲寒 2020-12-21 17:53

I built a small application in JavaFX yesterday. I wanted to get the Scene of the application in the Controller class. I got an error every time I tried to get the scene in

2条回答
  •  一生所求
    2020-12-21 18:53

    You can do

    private Node replaceSceneContent(String fxml) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(Main.class.getResource(fxml));
    
        BorderPane page = loader.load();
        MenuController controller = loader.getController();
    
        page.setOnKeyPressed(event -> {
            switch (event.getCode()) {
            case F11:
                if (stage.isFullScreen()) {
                    stage.setFullScreen(false);
                } else {
                    stage.setFullScreen(true);
                }
                break;
            default:
                break;
            }
        });
        Scene scene = new Scene(page);
        scene.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.A) {
                controller.printA();
            }
        });
    
    
        page.prefWidthProperty().bind(scene.widthProperty());
        page.prefHeightProperty().bind(scene.heightProperty());
        stage.setScene(scene);
        return controller ;
    }
    

    with

    public class MenuController extends BorderPane{
    
        // existing code...
    
        public void printA() {
            System.out.println("A!");
        }
    
    }
    

    Just a comment: it makes absolutely no sense for MenuController to be a subclass of BorderPane (or any other UI class). I left that in, in case you need it elsewhere, but it completely violates the MVC pattern.

    Additionally, I'm not really sure why you want the key handler for A to be on the scene, and the key handler for F11 to be on the root of the scene. It seems these should both be registered with the scene. But again, I left it as you had it in the question.

提交回复
热议问题