我想切换到另一个类(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 来设置您的第一个场景。
这是一个示例:
- Small JavaFX framework for swapping in and out child panes in a main FXML container.
- Loading new fxml in the same scene
另一个简化示例,不缓存场景或 Controller ,不使用 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;
}
}
关于java - 更改 JavaFX NullPointerException 中的场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463725/