将参数传递到JavaFX FXML中的新边框窗格

时间:2016-08-17 15:57:22

标签: javafx arguments fxml

因此,我需要将参数(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。打开新窗格就是这样,但正如我所说,我无法弄清楚如何传递参数

1 个答案:

答案 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();
}