将参数传递给 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();
}