У меня есть следующие в моем FXMLController:JavaFX табличного дерева Удалить элемент ContextMenu
@FXML
TreeTableView<FileModel> treeTblViewFiles;
//...
@Override
public void initialize(URL url, ResourceBundle rb) {
//...
final ObservableList<Song> data = FXCollections.observableArrayList(
new Song("Song#1", "/home/pm/songs/song1.mp3","12MB"),
new Song("Song#2", "/home/pm/songs/song2.mp3","12MB"),
new Song("Song#3", "/home/pm/songs/song3.mp3","12MB"),
new Song("Song#4", "/home/pm/songs/song4.mp3","12MB"),
new Song("Song#5", "/home/pm/songs/song5.mp3","12MB"),
new Song("Song#6", "/home/pm/songs/song6.mp3","12MB"),
new Song("Song#7", "/home/pm/songs/song7.mp3","12MB"),
new Song("Song#8", "/home/pm/songs/song8.mp3","12MB"),
new Song("Song#9", "/home/pm/songs/song9.mp3","12MB"),
new Song("Song#10", "/home/pm/songs/song10.mp3","12MB")
);
treeTblViewFiles.setRowFactory(new Callback<TreeTableView<FileModel>, TreeTableRow<FileModel>>(){
@Override
public TreeTableRow<FileModel> call(TreeTableView<FileModel> treeTableView) {
final TreeTableRow<FileModel> row = new TreeTableRow<>();
final ContextMenu rowMenu = new ContextMenu();
MenuItem removeItem = new MenuItem("Remove");
removeItem.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent t) {
data.remove(row.getItem());
treeTblViewFiles.getSelectionModel().clearSelection();
System.out.println("Context Menu -> ActionEvent");
}
});
rowMenu.getItems().add(removeItem);
row.contextMenuProperty().bind(Bindings.when(Bindings.isNotNull(row.itemProperty()))
.then(rowMenu)
.otherwise((ContextMenu)null));
return row;
}
});
//...
}
Песня класс, который наследует от FileModel. В основном, я создаю свою собственную фабрику строк, где я удаляю выбранный элемент, но ничего не происходит. Элемент управления TreeTableView не удаляется, но он удаляется из ObservableList.
Что мне не хватает или неправильно понято? Спасибо заранее.
Что-то выглядит странно с вашей моделью. Ваш TreeTableRow является TreeTableRow, поэтому row.getItem() вернет объект FileModel. данные являются ObservableList и состоят из объектов Song. Таким образом, не кажется, что row.getItem() может когда-либо быть членом данных, поэтому data.remove (row.getItem()) должен в основном быть не-op. –
Песня - это FileModel. Он удаляется из данных, но не из treeTable –