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().