TableView.setItems在java中抛出null异常

时间:2015-10-11 16:15:10

标签: java javafx tableview

我试图在我的View Table中添加一些项目。我创建一个ObservableList并将其传递给setItem方法,但它抛出null异常。

以下是最新的尝试:

        javafx.scene.control.TableView table = controller.friendsList;

        /*
        the controller.friendList is defined as Below :
        @FXML
        public javafx.scene.control.TableView friendsList;
        */

        ObservableList friendData = FXCollections.observableArrayList();

        for(Client friend : friends )
        {

            friendData.add(friend.getUsername());

        }
        //The friendData is fine ( according to the debugging ) it includes 2 Strings
        table.setItems(friendData);
        table.setEditable(false);
        table.setVisible(false);
        table.setVisible(true);

    }

代码有什么问题?

修改

现在我从FXMLLoader获得控制器,如answere所说。但它仍然是一样的。 @FXML anotation的所有字段仍为空。

这是我如何获得控制器:

public userSceneController controller;
FXMLLoader fxmlLoader = new FXMLLoader();
Parent root = fxmlLoader.load(getClass().getResource("userScene.fxml"));
controller = (userSceneController) fxmlLoader.getController();

1 个答案:

答案 0 :(得分:1)

由于您的TableView是控制器中的@FXML - 带注释的字段,因此它会在FXMLLoader创建的控制器实例中初始化。换句话说,大概是在您未实际显示的代码中的某个位置,您创建了FXMLLoader并在其上调用load()。作为load进程的一部分,FXMLLoader创建控制器的实例并初始化@FXML - 带注释的字段,并引用UI中显示的控件。

您可能打算配置UI中显示的表格视图;为此,您需要引用FXMLLoader为您创建的控制器。

但是,您在代码中实际执行的操作是创建一个新的控制器实例:

Controller controller = new Controller();

显然,由于这不是作为FXMLLoader.load()进程的一部分创建的控制器,因此它的friendsList字段从未初始化。

相反,您需要从FXML加载程序中检索控制器实例。为此,您必须创建一个FXMLLoader并正确设置位置,然后使用 实例 方法FXMLLoader.load(),而不是< strong> 静态 方法FXMLLoader.load(URL)

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("userScene.fxml"));
Parent root = (Parent) fxmlLoader.load();
controller = (userSceneController) fxmlLoader.getController();