我试图在我的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();
答案 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();