首页 文章

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

提问于
浏览
0

因此,我需要将参数(ID)传递给新窗口,该窗口通过单击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(); 
    }  
}

但是我没有加载FXML文件 . 我在StackOverflow Passing Parameters JavaFX FXML上看到了一个类似的问题,但它并没有尝试过这个问题,但没有运气:

MainController类

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类

@FXML
public void initialize(){

    showSeriesInfo();   
}
void initData(Integer showId) {
    this.seriesId = showId;
  }

附:打开新窗格就是这样,但正如我所说,我无法弄清楚如何传递参数

1 回答

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

相关问题