因此,我需要将参数(ID)传递给新窗口,该窗口通过单击TableView打开。具体来说,我需要将系列Id参数从MainContorller传递给TvShowsAboutController。
我正在从MainController打开TvShowsAboutController。像这样:
public void showSeriesInfo() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/javafx/tvShowAbout.fxml"));
TvShowAboutController controller =
loader.<TvShowAboutController>getController();
controller.initData(showsTable.getSelectionModel().getSelectedItem().getShowid());
BorderPane tvShows = (BorderPane) loader.load();
setCenterPane(tvShows);
} catch (Exception e) {
e.printStackTrace();
}
}
但我不知道如何在TvShowsAvoutController类中传递参数。如果我创建新的TvShowsAboutController类,它会崩溃,因为它没有加载FXML文件。我在StackOverflow Passing Parameters JavaFX FXML上看到了类似的问题,但它没有多大帮助。我试过这个,但没有运气:
MainController类
@FXML
public void initialize(){
showSeriesInfo();
}
void initData(Integer showId) {
this.seriesId = showId;
}
TvShowsAboutController类
{{1}}
P.S。打开新窗格就是这样,但正如我所说,我无法弄清楚如何传递参数
答案 0 :(得分:2)
默认情况下,FXMLLoader
创建FXML文件中指定的控制器类的实例。因此,控制器在加载FXML文件之后才能使用。所以你需要改变方法调用的顺序:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/javafx/tvShowAbout.fxml"));
BorderPane tvShows = (BorderPane) loader.load();
TvShowAboutController controller =
loader.<TvShowAboutController>getController();
controller.initData(showsTable.getSelectionModel().getSelectedItem().getShowid());
请注意,这意味着在TvShowAboutController
中,initialize()
之前会调用initData()
,因此您在initialize()
中所做的任何操作都不依赖于id
被初始化。在这种情况下,您应该将依赖于此的任何内容移动到initData()
方法。例如,您没有显示showSeriesInfo()
的作用,但您可能需要执行
// @FXML
// public void initialize() {
// showSeriesInfo();
// }
void initData(int showId) {
this.seriesId = showId ;
showSeriesInfo();
}