从FXML调用方法时java.lang.reflect.InvocationTargetException

时间:2017-08-23 10:40:46

标签: java

我正在制作一个相当简单的程序,但我无法弄清楚这里有什么问题。这是我的主要课程:

public class Main extends Application {

   private QualityList ql;
   private QualityController controller;
   private Stage primaryStage;

   @Override
   public void start(Stage stage) throws Exception {
        primaryStage = stage;
        Parent root = FXMLLoader.load(getClass().getResource("/controller/QualityWindow.fxml"));
        primaryStage.setTitle("Kwaliteiten V1.0");
        primaryStage.setScene(new Scene(root, 1250, 800));
        primaryStage.show();

        ql = new QualityList();
        controller = new QualityController();
        controller.initController(ql);
        controller.setStage(primaryStage);

        ql.addObserver(controller);
    }
    public static void main(String[] args) {
        launch(args);
    }
}

这是我的控制器类(我遇到问题的部分):

private QualityList ql;
private Stage stage;
private DBClass connect;

public void initController(QualityList ql){
    this.ql=ql;
    this.connect = new DBClass();
    readData();
    initialiseTable();
}
.
.
.
@FXML
void printData(ActionEvent event){
    ql.printData();
}

我遇到的问题是,当通过带有事件的接口调用方法printData时,它将导致java.lang.reflect.InvocationTargetException

然而,当从例如 initController 方法调用相同的方法时,它将完全按计划运行。

当在主类中创建原始 ql 对象并将其传递给控制器​​时,此问题似乎也只会出现。 如果我在控制器本身中创建 ql 对象没有问题但是我无法观察 ql 对象。

1 个答案:

答案 0 :(得分:0)

我的控制器初始化错误了。这是丰富的方式:

@Override
public void start(Stage primaryStage) throws Exception {
    ql = new QualityList();
    this.primaryStage = primaryStage;

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/controller/QualityWindow.fxml"));
    Parent root = loader.load();
    QualityController controller = loader.getController();
    //Parent root = FXMLLoader.load(getClass().getResource("/controller/QualityWindow.fxml"));
    primaryStage.setScene(new Scene(root, 1250, 800));
    primaryStage.setTitle("Kwaliteiten V1.0");
    primaryStage.show();

    controller.initController(ql);
    ql.addObserver(controller);
}
public static void main(String[] args) {
    launch(args);
}