javafx TableView 删除按钮

引言

JavaFX 是一个用于构建富互联网应用程序的框架,其中的 TableView 控件提供了一个表格视图,用于展示数据。在 TableView 中,我们可以通过添加按钮实现删除某一行数据的功能。本文将详细介绍如何在 JavaFX 的 TableView 控件中添加删除按钮,并给出相应的代码示例。

TableView 控件

TableView 是 JavaFX 中的一个控件,用于显示表格数据。它类似于 HTML 中的 table 元素,可以实现行和列的展示以及相应的排序和过滤功能。我们可以通过 TableColumn 来定义 TableView 的列,并使用 ObservableList 来作为 TableView 的数据源。

在 JavaFX 中,TableView 的每一行都是一个 TableRow,每一列都是一个 TableCell。TableRow 和 TableCell 都是可自定义的,我们可以为 TableCell 添加自定义的控件,比如按钮。接下来,我们将介绍如何在 TableCell 中添加删除按钮。

添加删除按钮

要在 TableCell 中添加删除按钮,我们需要自定义一个 TableCell 类,并重写其 updateItem 方法。在 updateItem 方法中,我们可以为 TableCell 设置内容,并添加删除按钮的事件处理逻辑。

class DeleteButtonCell extends TableCell<Item, Boolean> {
    final Button deleteButton = new Button("删除");

    DeleteButtonCell() {
        deleteButton.setOnAction(event -> {
            Item item = getTableView().getItems().get(getIndex());
            getTableView().getItems().remove(item);
        });
    }

    @Override
    protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        if (!empty) {
            setGraphic(deleteButton);
        } else {
            setGraphic(null);
        }
    }
}

在上面的代码中,我们自定义了一个 DeleteButtonCell 类,继承自 TableCell。在构造函数中,我们为删除按钮添加了点击事件处理逻辑。在 updateItem 方法中,我们根据单元格是否为空来设置按钮的内容。

接下来,我们需要将自定义的 TableCell 应用到 TableColumn 中。

TableColumn<Item, Boolean> deleteColumn = new TableColumn<>("删除");
deleteColumn.setCellFactory(col -> new DeleteButtonCell());

上述代码中,我们创建了一个 TableColumn,设置其标题为 "删除",并将自定义的 DeleteButtonCell 作为 TableCell 的工厂。

最后,我们需要将 TableColumn 添加到 TableView 中,并设置 TableView 的数据源。

TableView<Item> tableView = new TableView<>();
tableView.getColumns().add(deleteColumn);
tableView.setItems(data);

在上面的代码中,我们创建了一个 TableView,并将 TableColumn 添加到 TableView 的列集合中。然后,我们使用 setItems 方法将数据源 data 设置为 TableView 的数据。

完整示例代码

下面是一个完整的示例代码,展示了如何在 TableView 中添加删除按钮。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {
    public static class Item {
        private final String name;
        private final int quantity;

        public Item(String name, int quantity) {
            this.name = name;
            this.quantity = quantity;
        }

        public String getName() {
            return name;
        }

        public int getQuantity() {
            return quantity;
        }
    }

    @Override
    public void start(Stage primaryStage) {
        ObservableList<Item> data = FXCollections.observableArrayList(
                new Item("Apple", 10),
                new Item("Banana", 5),
                new Item("Orange", 3)
        );

        TableView<Item> tableView = new TableView<>();
        TableColumn<Item, String> nameColumn = new TableColumn<>("名称");
        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        TableColumn<Item, Integer> quantityColumn = new TableColumn<>("数量");
        quantityColumn.setCellValueFactory(new PropertyValueFactory<>("quantity"));
        TableColumn<Item, Boolean> deleteColumn = new TableColumn<>("删除");
        deleteColumn.setCellFactory(col -> new DeleteButtonCell());

        tableView.getColumns().addAll(nameColumn, quantityColumn, deleteColumn);
        tableView.setItems(data);

        VBox root = new VBox(tableView);
        Scene scene = new Scene(root, 400, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public static class DeleteButtonCell extends TableCell<Item, Boolean> {
        final Button deleteButton = new Button("删除");

        DeleteButtonCell() {
            deleteButton.setOnAction(event -> {
                Item item = getTableView().getItems().get(getIndex());
                getTableView().getItems().