TableView.setItems 在 java 中抛出空异常

TableView.setItems throw null Exception in java

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

这是最新的尝试:

        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 获得了控制器,如回答者所说。但它仍然是一样的。所有带有@FXML 注释的字段仍然是 null 。

这是我如何获得控制器的:

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

由于您的 TableView 是控制器中的 @FXML 注释字段,它在 FXMLLoader 创建的控制器实例中初始化。换句话说,大概在您实际上没有显示的代码中的某个时刻,您创建了一个 FXMLLoader 并在其上调用 load() 。作为该 load 过程的一部分,FXMLLoader 创建控制器的一个实例并初始化 @FXML 注释字段,并引用 UI 中显示的控件。

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

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

Controller controller = new Controller();

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

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

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