JavaFX. Удаление строк из TreeTableView
Всем доброго дня! Есть следующий кусок кода, описывающий структуру TreeTableView:
void FillTable(TreeTableView<Task> taskTable) throws SQLException {
DbHandler dbHandler = new DbHandler();
//Заполнение списка задач из базы данных
ObservableList<Task> taskList;
try{
taskList = dbHandler.getAllProducts();
}catch (SQLException e){
taskList = FXCollections.observableArrayList();
}
//Список корневых задач
ObservableList<Task> rootTasks = FXCollections.observableArrayList();
//Список дочерних задач
ObservableList<Task> childrenTasks = FXCollections.observableArrayList();
//Разделение задач на корневые и дочерние
for (Task task : taskList)
{
if (task.getRootTask()) rootTasks.add(task);
else childrenTasks.add(task);
}
//Присвоение дочерних задач к своим корневым задачам (по идентификатору задачи)
TreeItem<Task>startItem = new TreeItem<Task>();
for (Task task : rootTasks)
{
Integer idTask = task.getIdTask();
TreeItem<Task> rootTreeItem = new TreeItem<Task>(task);
for (Task children : childrenTasks)
{
if (children.getIdTask() == idTask)
{
TreeItem<Task> childrenTreeItem = new TreeItem<Task>(children);
rootTreeItem.getChildren().add(childrenTreeItem);
}
}
startItem.getChildren().add(rootTreeItem);
}
taskTable.setRoot(startItem);
taskTable.setShowRoot(false);
}
Не могу нигде найти, как можно удалить строку из такой структуры и вообще какую-либо информацию по удалению строк из TreeTableView.
Ответы (1 шт):
Автор решения: siarhei987
→ Ссылка
Код, который непосредственно удаляет запись, помещён внутри обработчика нажатия на кнопку "Удалить".
deleteBtn.setOnAction(action -> {
var selection = treeTable.getSelectionModel();
var index = selection.getSelectedIndex();
if (index > -1) {
var selectedItem = treeTable.getTreeItem(index);
selectedItem.getParent().getChildren().remove(selectedItem);
selection.clearSelection();
deletionInfo.setValue("Удалено: " + selectedItem.getValue().toString());
} else {
deletionInfo.setValue("");
}
});
Весь код.
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.util.List;
public class TreeTableViewApp extends Application {
private final StringProperty deletionInfo = new SimpleStringProperty();
private record Task(Integer id, String task) {
}
@Override
public void start(Stage stage) {
var treeTable = new TreeTableView<Task>();
fillTreeTable(treeTable);
var deleteBtn = new Button("Удалить");
deleteBtn.setOnAction(action -> {
var selection = treeTable.getSelectionModel();
var index = selection.getSelectedIndex();
if (index > -1) {
var selectedItem = treeTable.getTreeItem(index);
selectedItem.getParent().getChildren().remove(selectedItem);
selection.clearSelection();
deletionInfo.setValue("Удалено: " + selectedItem.getValue().toString());
} else {
deletionInfo.setValue("");
}
});
var lastDeletionLabel = new Label();
lastDeletionLabel.setFont(Font.font(10));
lastDeletionLabel.textProperty().bind(deletionInfo);
var group = new HBox(12, lastDeletionLabel, deleteBtn);
group.setPadding(new Insets(10));
group.setAlignment(Pos.CENTER_RIGHT);
var root = new VBox();
root.getChildren().addAll(treeTable, group);
stage.setScene(new Scene(root, 400, 250));
stage.show();
}
private void fillTreeTable(TreeTableView<Task> tableView) {
var idColumn = new TreeTableColumn<Task, String>("Номер");
idColumn.setPrefWidth(100);
var taskColumn = new TreeTableColumn<Task, String>("Задание");
idColumn.setCellValueFactory(cellData -> new SimpleStringProperty(
cellData.getValue().getValue().id().toString()
));
taskColumn.setCellValueFactory(cellData -> new SimpleStringProperty(
cellData.getValue().getValue().task()
));
tableView.getColumns().addAll(List.of(idColumn, taskColumn));
var rootItem = new TreeItem<Task>();
rootItem.getChildren().addAll(getContent());
tableView.setRoot(rootItem);
tableView.setShowRoot(false);
}
private List<TreeItem<Task>> getContent() {
var drawFigures = new TreeItem<>(new Task(100, "Нарисовать фигуры"));
drawFigures.getChildren().addAll(List.of(
new TreeItem<>(new Task(101, "Овал")),
new TreeItem<>(new Task(102, "Треугольник"))
));
var drawAnimals = new TreeItem<>(new Task(200, "Нарисовать животных"));
drawAnimals.getChildren().addAll(List.of(
new TreeItem<>(new Task(201, "Птица")),
new TreeItem<>(new Task(202, "Ёж"))
));
return List.of(drawFigures, drawAnimals);
}
public static void main(String[] args) {
launch(args);
}
}