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;