TableView点击行数据修改提示JavaFX

引言

JavaFX是一个用于构建丰富图形用户界面(GUI)应用程序的框架。其中,TableView是一个非常常用的控件,用于展示和编辑表格数据。在使用TableView时,经常需要实现点击表格行数据后进行修改的功能,并在修改完成后给出相应的提示。

本文将介绍如何使用JavaFX的TableView控件实现点击行数据修改提示的功能。我们将通过一个简单的示例来演示如何实现这个功能,并提供完整的代码和详细的解释。

示例说明

我们的示例将展示一个学生信息管理的应用程序。我们将使用TableView来展示学生的姓名、年龄和性别信息,并实现点击行数据后将其修改的功能。当用户修改完数据后,我们将给出一个弹窗提示,告知修改成功。

以下是我们的示例应用程序的整体效果:

示例应用程序效果

示例代码

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableViewExample extends Application {

    private TableView<Student> table = new TableView<>();
    private ObservableList<Student> students = FXCollections.observableArrayList(
            new Student("张三", 20, "男"),
            new Student("李四", 21, "女"),
            new Student("王五", 22, "男")
    );

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

    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("学生信息管理");
        stage.setWidth(450);
        stage.setHeight(500);

        final Label label = new Label("学生信息");
        label.setFont(new javafx.scene.text.Font("Arial", 20));

        TableColumn<Student, String> nameCol = new TableColumn<>("姓名");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));

        TableColumn<Student, Integer> ageCol = new TableColumn<>("年龄");
        ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));

        TableColumn<Student, String> genderCol = new TableColumn<>("性别");
        genderCol.setCellValueFactory(new PropertyValueFactory<>("gender"));

        table.setItems(students);
        table.getColumns().addAll(nameCol, ageCol, genderCol);
        table.setEditable(true);

        table.setRowFactory(tv -> {
            TableRow<Student> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && !row.isEmpty()) {
                    Student student = row.getItem();
                    editStudent(student);
                }
            });
            return row;
        });

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new javafx.geometry.Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        stage.setScene(scene);
        stage.show();
    }

    private void editStudent(Student student) {
        Dialog<ButtonType> dialog = new Dialog<>();
        dialog.setTitle("修改学生信息");
        dialog.setHeaderText("请输入学生信息");

        ButtonType confirmButtonType = new ButtonType("确定", ButtonBar.ButtonData.OK_DONE);
        dialog.getDialogPane().getButtonTypes().addAll(confirmButtonType, ButtonType.CANCEL);

        TextField nameField = new TextField(student.getName());
        TextField ageField = new TextField(String.valueOf(student.getAge()));
        TextField genderField = new TextField(student.getGender());

        dialog.getDialogPane().setContent(new VBox(8, nameField, ageField, genderField));

        dialog.setResultConverter(dialogButton -> {
            if (dialogButton == confirmButtonType) {
                student.setName(nameField.getText());
                student.setAge(Integer.parseInt(ageField.getText()));
                student.setGender(genderField.getText());
                return ButtonType.OK;
            }
            return ButtonType.CANCEL;
        });

        dialog.showAndWait().ifPresent(response -> {
            if (response == ButtonType.OK) {
                showAlert("修改成功!");
            }
        });
    }

    private void showAlert(String message) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("提示");
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }

    public static class Student {

        private String name;
        private int age;
        private String gender;

        public Student(String name, int age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;