本文介绍了在 JavaFX NullPointerException 中更改场景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想换到另一个班级的场景,但我遇到了很大的困难.

现在我可以移到第二个屏幕没问题,但移回第一个屏幕给我NullPointerException.

帮助将不胜感激.非常感谢.

主类

public class Main extends Application {阶段 ps;组根 = new Group();Scene s = new Scene(root, 300, 300, Color.AQUA);控制器 con = new Controller();public void start(Stage primaryStage) 抛出异常 {ps = 初级阶段;con.buttonLayout();按钮布局();primaryStage.setTitle("Hello World");ps.setScene(s);primaryStage.show();}公共无效按钮布局(){Button but = new Button("first");but.setOnMouseClicked(new EventHandler() {@覆盖公共无效句柄(鼠标事件事件){ps.setScene(con.s);}});root.getChildren().add(but);}公共静态无效主(字符串 [] args){发射(参数);}}

其他类

公共类控制器{组根 = new Group();Scene s = new Scene(root, 300, 300, Color.BLACK);公共无效按钮布局(){Button but = new Button("回到第一个");but.setOnMouseClicked(new EventHandler() {@覆盖公共无效句柄(鼠标事件事件){Main main = new Main();main.ps.setScene(main.s);}});root.getChildren().add(but);}}
解决方案

重构您的应用程序,创建两个控制器而不是一个.所以每个场景都有一个控制器.在您的主应用程序中,只需调用第一个控制器来设置您的第一个场景.

这是一个示例:

  • Main.java

    import javafx.application.Application;导入 javafx.scene.Scene;导入 javafx.scene.paint.Color;导入 javafx.stage.Stage;公共类 Main 扩展应用程序 {公共无效开始(阶段阶段)抛出异常{控制器 1 控制器 1 = 新控制器 1();场景场景 = 新场景(controller1.getContent(), 300, 300, Color.AQUA);stage.setScene(场景);舞台表演();}公共静态无效主(字符串 [] args){发射(参数);}}

    Controller.java

    import javafx.scene.Parent;公共接口控制器{父 getContent();}

    Controller1.java

    import javafx.scene.Parent;导入 javafx.scene.control.Button;导入 javafx.scene.layout.StackPane;公共类 Controller1 实现 Controller {私有最终 StackPane 根;公共控制器1(){Button navToSecond = new Button("second");navToSecond.setOnMouseClicked(事件 -> {控制器 2 控制器 2 = 新控制器 2();navToSecond.getScene().setRoot(controller2.getContent());});root = new StackPane(navToSecond);}@覆盖公共父 getContent() {返回根;}}

    Controller2.java

    import javafx.scene.Parent;导入 javafx.scene.control.Button;导入 javafx.scene.layout.StackPane;公共类 Controller2 实现 Controller {私有最终 StackPane 根;公共控制器2(){Button navToFirst = new Button("first");navToFirst.setOnMouseClicked(事件 -> {控制器 1 控制器 1 = 新控制器 1();navToFirst.getScene().setRoot(controller1.getContent());});root = new StackPane(navToFirst);}@覆盖公共父 getContent() {返回根;}}

    I'm wanting to change to a scene in another class but I'm having great difficulty.

    Now the I can move to the to the second screen no problem, but moving back to the first screen gives me the NullPointerException.

    Help would be much appreciated. Many thanks in advance.

    Main Class

    public class Main extends Application {
    
    Stage ps;
    Group root = new Group();
    Scene s = new Scene(root, 300, 300, Color.AQUA);
    Controller con = new Controller();
    
    
    public void start(Stage primaryStage) throws Exception {
        ps = primaryStage;
        con.buttonLayout();
        buttonLayout();
    
        primaryStage.setTitle("Hello World");
        ps.setScene(s);
        primaryStage.show();
    }
    
    public void buttonLayout() {
        Button but = new Button("first");
    
        but.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                ps.setScene(con.s);
            }
        });
    
        root.getChildren().add(but);
    }
    
    
    public static void main(String[] args) {
        launch(args);
    }
    }
    

    Other class

    public class Controller{
    Group root = new Group();
    Scene s = new Scene(root, 300, 300, Color.BLACK);
    
    
    public void buttonLayout() {
        Button but = new Button("back to first");
    
        but.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                Main main = new Main();
                main.ps.setScene(main.s);
            }
        });
    
        root.getChildren().add(but);
    }
    }
    
    解决方案

    Restructure your application, create two controllers instead of just one. So you have one controller for each scene. And in your main application, just invoke the first controller to set your first scene.

    Here is a sample:


    An additional simplified example which does not cache scenes or controllers, does not use FXML and completely replaces the content of the scene on each navigation:

    Main.java

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class Main extends Application {
        public void start(Stage stage) throws Exception {
            Controller1 controller1 = new Controller1();
            Scene scene = new Scene(
                    controller1.getContent(), 300, 300, Color.AQUA
            );
    
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    Controller.java

    import javafx.scene.Parent;
    
    public interface Controller {
        Parent getContent();
    }
    

    Controller1.java

    import javafx.scene.Parent;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    
    public class Controller1 implements Controller {
        private final StackPane root;
    
        public Controller1() {
            Button navToSecond = new Button("second");
    
            navToSecond.setOnMouseClicked(event -> {
                Controller2 controller2 = new Controller2();
                navToSecond.getScene().setRoot(controller2.getContent());
            });
    
            root = new StackPane(navToSecond);
        }
    
        @Override
        public Parent getContent() {
            return root;
        }
    }
    

    Controller2.java

    import javafx.scene.Parent;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    
    public class Controller2 implements Controller {
        private final StackPane root;
    
        public Controller2() {
            Button navToFirst = new Button("first");
    
            navToFirst.setOnMouseClicked(event -> {
                Controller1 controller1 = new Controller1();
                navToFirst.getScene().setRoot(controller1.getContent());
            });
    
            root = new StackPane(navToFirst);
        }
    
        @Override
        public Parent getContent() {
            return root;
        }
    }
    

    这篇关于在 JavaFX NullPointerException 中更改场景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-05 05:28