如何在 JavaFX 的不同控制器 class 中设置 TableView 的项目?

How to set items of a TableView in a different controller class in JavaFX?

我有两个带有两个控制器的 fxml 文件 classes MainController 和 PlaylistController。每个class都有一个TableView,分别是tablenTable

table 在 TabPane

上显示为默认选项卡

nTable 适用于使用按钮创建的新选项卡。

我想要的是能够 select 默认 table 中的项目,并通过一个操作将它们添加到新选项卡上的新 table (我可以做到它使用两个按钮,其中一个在创建新选项卡后被单击)。

我想我需要确保程序在设置项目之前等待创建新选项卡,但我不知道该怎么做。

这是我正在使用的方法:

@FXML
PlaylistController pc;    

public static ObservableList<Track> newTracklist = FXCollections.observableArrayList();

public void addToNewPlaylist(){
    newTracklist.clear();
    newTracklist.addAll(table.getSelectionModel().getSelectedItems());

    Tab nTab = new Tab();

    FXMLLoader nLoader = new FXMLLoader(getClass().getResource("/fxml/fxPlaylist.fxml"));
    try {
        Parent nRoot = nLoader.load();
        nTab.setContent(nRoot);     
    } catch (IOException e) {
        e.printStackTrace();
    }
    tabPane.getTabs().add(nTab);
    nTab.isClosable();
    pc.nTable.setItems(newTracklist);
}

除非您要定义常量或类似的东西,否则 static 字段在控制器中没有位置。

在您的 PlaylistController 中定义一个方法来获取 Track 的列表以在其 table 中显示:

public class PlaylistController {

    @FXML
    private TableView<Track> nTable ;

    // ...

    public void setTracks(List<Track> tracks) {
        nTable.getItems().setAll(tracks);
    }

    // ...
}

然后在加载 FXML 时调用它:

public void addToNewPlaylist(){

    Tab nTab = new Tab();

    FXMLLoader nLoader = new FXMLLoader(getClass().getResource("/fxml/fxPlaylist.fxml"));
    try {
        Parent nRoot = nLoader.load();
        PlaylistController controller = nLoader.getController();
        controller.setTracks(table.getSelectionModel().getSelectedItems());
        nTab.setContent(nRoot);     
    } catch (IOException e) {
        e.printStackTrace();
    }
    tabPane.getTabs().add(nTab);
}