Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX中FXML控制器的实例返回null_Javafx_Controller_Null_Fxml - Fatal编程技术网

JavaFX中FXML控制器的实例返回null

JavaFX中FXML控制器的实例返回null,javafx,controller,null,fxml,Javafx,Controller,Null,Fxml,我想通过Main类中的这一行为FXML控制器创建一个引用 Controller controller = (Controller) loader.getController(); 从类GrblListener访问控制器方法 Main.controller.updateCurrentPosition(input); 但我总是犯错误 Exception in thread "EventThread COM5" java.lang.NullPointerException 怎么了 主类: pub

我想通过Main类中的这一行为FXML控制器创建一个引用

Controller controller = (Controller) loader.getController();
从类GrblListener访问控制器方法

Main.controller.updateCurrentPosition(input);
但我总是犯错误

Exception in thread "EventThread COM5" java.lang.NullPointerException
怎么了

主类:

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);
    }
}
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();
不是初始化您声明的
静态
变量:

public static Controller controller ;

public void start(Stage stage) {

    controller = (Controller) loader.getController();

    // ...
}

您正在
start()
中声明一个局部变量,并对其进行初始化:

Controller controller = (Controller) loader.getController();
不是初始化您声明的
静态
变量:

public static Controller controller ;

public void start(Stage stage) {

    controller = (Controller) loader.getController();

    // ...
}

如何连接控制器?手动?还是在FXML中?难道你没有忘记FXML中的fx:controller=“controller”吗?我用SceenBuilder创建了FXML,所以我连接了fx:controller=“package.controller”。现在我通过在GrblListener类中创建一个公共变量来避免这个问题,然后在Class controller中每隔一秒用定时器检查一次以触发该操作。。。不是最好的解决方案…我发布的解决方案有什么问题?如何连接控制器?手动?还是在FXML中?难道你没有忘记FXML中的fx:controller=“controller”吗?我用SceenBuilder创建了FXML,所以我连接了fx:controller=“package.controller”。现在我通过在GrblListener类中创建一个公共变量来避免这个问题,然后在Class controller中每隔一秒用定时器检查一次以触发该操作。。。不是最好的解决方案…我发布的解决方案有什么问题?