如何使表格单元格编辑的更改永久化?
我想再次运行应用程序时将更改保存到表中。下面的代码允许用户编辑单元格并提交更改,但是当我再次运行应用程序时,不会保存更改。我如何使表格单元格编辑的更改永久化?代码如下。 (来自oracle的网站)。我试着玩弄它,但没有成功。如何使表格单元格编辑的更改永久化?
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private final TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "[email protected]"),
new Person("Isabella", "Johnson", "[email protected]"),
new Person("Ethan", "Williams", "[email protected]"),
new Person("Emma", "Jones", "[email protected]"),
new Person("Michael", "Brown", "[email protected]ample.com"));
final HBox hb = new HBox();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(450);
stage.setHeight(550);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
table.setEditable(true);
TableColumn<Person, String> firstNameCol =
new TableColumn<>("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<>("firstName"));
firstNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
firstNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setFirstName(t.getNewValue());
});
TableColumn<Person, String> lastNameCol =
new TableColumn<>("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<>("lastName"));
lastNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
lastNameCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setLastName(t.getNewValue());
});
TableColumn<Person, String> emailCol = new TableColumn<>("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<>("email"));
emailCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());
emailCol.setOnEditCommit(
(CellEditEvent<Person, String> t) -> {
((Person) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setEmail(t.getNewValue());
});
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
final TextField addFirstName = new TextField();
addFirstName.setPromptText("First Name");
addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
final TextField addLastName = new TextField();
addLastName.setMaxWidth(lastNameCol.getPrefWidth());
addLastName.setPromptText("Last Name");
final TextField addEmail = new TextField();
addEmail.setMaxWidth(emailCol.getPrefWidth());
addEmail.setPromptText("Email");
final Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person(
addFirstName.getText(),
addLastName.getText(),
addEmail.getText()));
addFirstName.clear();
addLastName.clear();
addEmail.clear();
});
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
hb.setSpacing(3);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, hb);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
你将不得不使用一个持久层,例如一个数据库来存储值和再次找到它们,或者干脆你写每一个通过的分离器分离的enetered值,您使用的文本文件选择。
实际上,我正在使用数据库,(在我的代码中)这些值来自数据库。但我不知道如何从变量中的文本字段获取值然后保存它。 (我知道如何将它保存在数据库中),但只是从文本域 – user8783104
获取值的方法,但是您说即使重新运行程序也想获得这些值,如果它们有效不是来自数据库? –
是的,我做..我对你的问题感到困惑。他们确实来自数据库(在我的代码中)。 – user8783104
从评论我明白,问题是如何从表中获取数据,所以你可以把它写入数据库。
表格信息由ObservableList<Person> data
表示。它总是反映实际的表格信息。
要获取信息,只需循环它即可。运行以下测试:
添加一个方法来打印一些表的数据:
private void printSomeTableData() {
for(Person p : data) {
System.out.println(p.getFirstName() + ", " + p.lastName.get()+ ", " +p.getEmail());
}
}
在构造函数中添加一个按钮,使用此方法:当您按下
final Button printButton = new Button("Print");
printButton.setOnAction(e -> printSomeTableData());
//change
// hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
//to
hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton, printButton);
“打印“已更新表格数据打印出来。
我希望这个简单的测试可以使机制变得清晰。 想像TableView
作为ObservableList<Person> data
的图示。表格信息的任何变化都反映在data
中。
他的thx它得到的值,但它仍然为空,因为它返回旧值而不是用户在文本字段中输入的值。这可能意味着在文本字段中输入值不会更新列表。 – user8783104
我不知道你的意思是“它”。看着这些评论,我发现它很明显:当你启动应用程序时,你需要获得更新的数据,使其持久化(数据库)并从数据库重新加载数据。 – c0der
这是印刷的价值。我说你提供的代码没有获得更新的数据,它在用户编辑单元格之前获取数据。因此,打印null – user8783104
你的代码没有被永久保存任何东西。如果你想要的话,你需要编程。 –