java - 更改 JavaFX NullPointerException 中的场景

标签 java javafx nullpointerexception scene

我想切换到另一个类(class)的场景,但我遇到了很大的困难。

现在我可以毫无问题地移动到第二个屏幕,但是移回第一个屏幕会给我带来 NullPointerException

非常感谢您的帮助。非常感谢。

主类

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);
}
}

其他类

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);
}
}

最佳答案

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

这是一个示例:


另一个简化示例,不缓存场景或 Controller ,不使用 FXML,并完全替换每个导航上的场景内容:

first second

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;
    }
}

关于java - 更改 JavaFX NullPointerException 中的场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463725/

相关文章:

java - Cassandra read_request_timeout_in_ms 为外部(客户端)请求设置

java - 未捕获的翻译错误 : com. android.dx.cf.code.SimException

JavaFX 无法编辑文本

JavaFX 与 Junit

java - 线程 "AWT-EventQueue-1"中的异常

Java:NullPointerException 二维对象数组甚至数组已初始化并填充

java - 映射中的空检查获取空指针异常

java - Jdatechooser 文本右对齐

OSX 上命令行中的 Javapackager 工具?

java - Netty HttpServer api 已更改/与可用示例不同