JavaFX-编辑TableView不会更新模型属性

时间:2018-12-12 14:15:22

标签: java javafx

我已使用以下代码创建了TableView;

TableView<Person> tableView = new TableView<>();
TableColumn<Person,String> firstNameCol = new TableColumn<>("First Name");
firstNameCol .setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
tableView.getColumns().add(firstNameCol);
tableView.getItems().add(new Person("John"));
firstNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn()));

我的模型如下;

class Person{

   private SimpleStringProperty firstName;

   public Person(String firstName){
        this.firstName = new SimpleStringProperty(firstName);
   }

   public final void setFirstName(String value){
         firstName.set(value);
         System.out.println("first name updated");
   }

   public final String getFirstName(){
        return firstName.get();
   }

   public SimpleStringProperty firstNameProperty(){
        return firstName;
   }
}

现在,当我编辑“名字”列时,我应该获得“已更新名字”的输出,但我没有,这意味着不会调用模型属性的set方法。是不是应该这样,否则我的理解是错误的?预先感谢。

1 个答案:

答案 0 :(得分:2)

您从cellValueFactory返回属性。假设您没有为该列指定onEditCommit事件处理程序,则SimpleStringProperty对象将被修改。不包含包含该字段的类的setter方法。

您应该能够通过向构造函数中的属性添加侦听器或扩展SimpleStringProperty来验证这一点:

this.firstName = new SimpleStringProperty(firstName) {

    @Override
    public void set(String value) {
        super.set(value);
        System.out.println("first name updated (SimpleStringProperty.set)");
    }

};

this.firstName.addListener((o, oldValue, newValue) -> System.out.println("first name updated (SimpleStringProperty.set)"));