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();
我正在尝试向我的视图中添加一些项目 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();