【问题标题】:Changing Scenes in JavaFX NullPointerException在 JavaFX NullPointerException 中更改场景
【发布时间】:2016-04-06 22:54:28
【问题描述】:

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

现在我可以移到第二个屏幕没问题,但是移回第一个屏幕会给我 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);
}
}

【问题讨论】:

  • main.ps 永远不会被初始化,因此当您在其上调用setScene 时会出现空指针异常。

标签: java javafx nullpointerexception scene


【解决方案1】:

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

这是一个示例:


另外一个简化的例子,它不缓存场景或控制器,不使用 FXML 并且完全替换每个导航上的场景内容:

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

【讨论】:

  • 抱歉忽略名称控制器。我实际上并没有使用 fxml
  • 无论你是否使用FXML,原理都是一样的。
  • 为我工作 Pranjal:jdk8u72,OS X 10.9.5。我不知道你为什么有一个空根问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多