将参数传递给 JavaFX FXML 中的新边框窗格
Passing parameter to new border pane in JavaFX FXML
因此,我需要将参数 (ID) 传递给新的 window,它通过单击 TableView 打开。具体来说,我需要将系列 Id 参数从 MainContorller 传递到 TvShowsAboutController。
我正在从 MainController 打开 TvShowsAboutController。像这样:
public void showSeriesInfo() {
try {
BorderPane tvShows = (BorderPane) FXMLLoader.load(getClass().getResource("/seriesapp/javafx/tvShowAbout.fxml"));
setCenterPane(tvShows);
} catch (Exception e) {
e.printStackTrace();
}
}
但我不知道如何在 TvShowsAvoutController 中传递参数 class。如果我创建新的 TvShowsAboutController class 然后它崩溃,因为它没有加载 FXML 文件。我在 Whosebug Passing Parameters JavaFX FXML 上看到了类似的问题,但没有太大帮助。我试过这个,但没有成功:
主控制器class
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();
}
}
TvShowsAboutController class
@FXML
public void initialize(){
showSeriesInfo();
}
void initData(Integer showId) {
this.seriesId = showId;
}
P.S。以这种方式打开新窗格,但正如我所说,我无法弄清楚如何传递参数
默认情况下,FXMLLoader
创建在 FXML 文件中指定的控制器实例 class。因此,在加载 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();
}
因此,我需要将参数 (ID) 传递给新的 window,它通过单击 TableView 打开。具体来说,我需要将系列 Id 参数从 MainContorller 传递到 TvShowsAboutController。
我正在从 MainController 打开 TvShowsAboutController。像这样:
public void showSeriesInfo() {
try {
BorderPane tvShows = (BorderPane) FXMLLoader.load(getClass().getResource("/seriesapp/javafx/tvShowAbout.fxml"));
setCenterPane(tvShows);
} catch (Exception e) {
e.printStackTrace();
}
}
但我不知道如何在 TvShowsAvoutController 中传递参数 class。如果我创建新的 TvShowsAboutController class 然后它崩溃,因为它没有加载 FXML 文件。我在 Whosebug Passing Parameters JavaFX FXML 上看到了类似的问题,但没有太大帮助。我试过这个,但没有成功:
主控制器class
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();
}
}
TvShowsAboutController class
@FXML
public void initialize(){
showSeriesInfo();
}
void initData(Integer showId) {
this.seriesId = showId;
}
P.S。以这种方式打开新窗格,但正如我所说,我无法弄清楚如何传递参数
默认情况下,FXMLLoader
创建在 FXML 文件中指定的控制器实例 class。因此,在加载 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();
}