2017-11-25 132 views
1

我想再次运行应用程序时将更改保存到表中。下面的代码允许用户编辑单元格并提交更改,但是当我再次运行应用程序时,不会保存更改。我如何使表格单元格编辑的更改永久化?代码如下。 (来自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); 
     } 
    } 
} 
+1

你的代码没有被永久保存任何东西。如果你想要的话,你需要编程。 –

回答

0

你将不得不使用一个持久层,例如一个数据库来存储值和再次找到它们,或者干脆你写每一个通过的分离器分离的enetered值,您使用的文本文件选择。

+0

实际上,我正在使用数据库,(在我的代码中)这些值来自数据库。但我不知道如何从变量中的文本字段获取值然后保存它。 (我知道如何将它保存在数据库中),但只是从文本域 – user8783104

+0

获取值的方法,但是您说即使重新运行程序也想获得这些值,如果它们有效不是来自数据库? –

+0

是的,我做..我对你的问题感到困惑。他们确实来自数据库(在我的代码中)。 – user8783104

0

从评论我明白,问题是如何从表中获取数据,所以你可以把它写入数据库。
表格信息由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中。

+0

他的thx它得到的值,但它仍然为空,因为它返回旧值而不是用户在文本字段中输入的值。这可能意味着在文本字段中输入值不会更新列表。 – user8783104

+0

我不知道你的意思是“它”。看着这些评论,我发现它很明显:当你启动应用程序时,你需要获得更新的数据,使其持久化(数据库)并从数据库重新加载数据。 – c0der

+0

这是印刷的价值。我说你提供的代码没有获得更新的数据,它在用户编辑单元格之前获取数据。因此,打印null – user8783104

0

从评论我看到,你不知道如何从textfields获取值...嗯,这是非常简单的,尝试像这样:textFieldName.getText(),你将有价值该文本字段:)

编辑: 用于遍历一个TableView中做这样的事情:

for (Person person : table.getItems()){ writeToDatabase(person.getFirstName());} 
+0

持久化所需的数据存储在表模型('data')中 – c0der

+0

因此,您想从表中获取数据? –

+0

是的,将它写入数据库。 – c0der

相关问题