JavaFX 中的 FXML 控制器实例 returns null
Instance of FXML controller in JavaFX returns null
我想通过 Class Main
中的这一行为 FXML 控制器创建一个引用
Controller controller = (Controller) loader.getController();
从 Class GrblListener 访问控制器方法。
Main.controller.updateCurrentPosition(input);
但我总是得到错误
Exception in thread "EventThread COM5" java.lang.NullPointerException
怎么了?
Class 主要:
public class Main extends Application {
public static Stage stage;
public static Controller controller;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Scene.fxml"));
Parent root = (Parent) loader.load();
Controller controller = (Controller) loader.getController();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("css/default.css").toExternalForm());
stage.setTitle("...");
stage.setScene(scene);
stage.show();
this.stage = stage;
}
public static void main(String[] args) {
launch(args);
}
}
Class GrblListener:
class GrblListener implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
if(event.isRXCHAR() && event.getEventValue() > 0){
try {
String input = GrblSender.serialPort.readString();
System.out.println(input.trim());
Main.controller.updateCurrentPosition(input);
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}
}
}
您正在 start()
中声明一个局部变量并对其进行初始化:
Controller controller = (Controller) loader.getController();
而不是初始化您声明的 static
变量:
public static Controller controller ;
public void start(Stage stage) {
controller = (Controller) loader.getController();
// ...
}
我想通过 Class Main
中的这一行为 FXML 控制器创建一个引用Controller controller = (Controller) loader.getController();
从 Class GrblListener 访问控制器方法。
Main.controller.updateCurrentPosition(input);
但我总是得到错误
Exception in thread "EventThread COM5" java.lang.NullPointerException
怎么了?
Class 主要:
public class Main extends Application {
public static Stage stage;
public static Controller controller;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Scene.fxml"));
Parent root = (Parent) loader.load();
Controller controller = (Controller) loader.getController();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("css/default.css").toExternalForm());
stage.setTitle("...");
stage.setScene(scene);
stage.show();
this.stage = stage;
}
public static void main(String[] args) {
launch(args);
}
}
Class GrblListener:
class GrblListener implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
if(event.isRXCHAR() && event.getEventValue() > 0){
try {
String input = GrblSender.serialPort.readString();
System.out.println(input.trim());
Main.controller.updateCurrentPosition(input);
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}
}
}
您正在 start()
中声明一个局部变量并对其进行初始化:
Controller controller = (Controller) loader.getController();
而不是初始化您声明的 static
变量:
public static Controller controller ;
public void start(Stage stage) {
controller = (Controller) loader.getController();
// ...
}