更改JavaFX中的场景NullPointerException [英] Changing Scenes in JavaFX NullPointerException
问题描述
我想要换到另一个班级的场景,但我遇到了很大困难。
现在我可以转到第二个屏幕了问题,但回到第一个屏幕给我 NullPointerException 。
非常感谢帮助。非常感谢提前。
主类
public class Main扩展Application {
Stage ps;
Group root = new Group();
场景s =新场景(root,300,300,Color.AQUA);
Controller con = new Controller();
public void start(Stage primaryStage)抛出异常{
ps = primaryStage;
con.buttonLayout();
buttonLayout();
primaryStage.setTitle(Hello World);
ps.setScene(s);
primaryStage.show();
}
public void buttonLayout(){
Button但= = 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();
场景s =新场景(root,300,300,Color.BLACK);
public void buttonLayout(){
Button但= = 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.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
公共类Main扩展Application {
public void start(Stage stage)throws Exception {
Controller1 controller1 = new Controller1();
场景场景=新场景(
controller1.getContent(),300,300,Color.AQUA
);
stage.setScene(场景);
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;
公共类Controller1实现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;
公共类Controller2实现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;
}
}
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:
- Small JavaFX framework for swapping in and out child panes in a main FXML container.
- Loading new fxml in the same scene
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!