如何在 JavaFX 的不同控制器 class 中设置 TableView 的项目?
How to set items of a TableView in a different controller class in JavaFX?
我有两个带有两个控制器的 fxml 文件 classes MainController 和 PlaylistController。每个class都有一个TableView,分别是table
和nTable
。
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);
}
我有两个带有两个控制器的 fxml 文件 classes MainController 和 PlaylistController。每个class都有一个TableView,分别是table
和nTable
。
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);
}