JavaFX中的可编辑表格单元格在再次尝试编辑时会显示旧值

JavaFX中的可编辑表格单元格在再次尝试编辑时会显示旧值,java,javafx,Java,Javafx,编辑: --------------------------------------- 我添加了类InterfaceEntry,它包装条目,并为其提供JavaFX属性: public class InterfaceEntry { private StringProperty service = new SimpleStringProperty(); private StringProperty username = new SimpleStringProperty();

编辑:
---------------------------------------
我添加了类
InterfaceEntry
,它包装
条目
,并为其提供JavaFX属性:

public class InterfaceEntry {

    private StringProperty service = new SimpleStringProperty();
    private StringProperty username = new SimpleStringProperty();

    public InterfaceEntry() {}

    public InterfaceEntry(Entry entry) {
        setService(entry.getService());
        setUsername(entry.getUsername());
    }

    public Entry toEntry() {
        Entry entry = new Entry();

        entry.setService(getService());
        entry.setUsername(getUsername());

        return entry;
    }

    public String getService() {
        return service.get();
    }

    public StringProperty serviceProperty() {
        return service;
    }

    public void setService(String service) {
        this.service.set(service);
    }

    public String getUsername() {
        return username.get();
    }

    public StringProperty usernameProperty() {
        return username;
    }

    public void setUsername(String username) {
        this.username.set(username);
    }
}
---------------------------------------



初始问题:
---------------------------------------
我在FXML中创建了如下表:

<TableView fx:id="tableView" editable="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="50.0">
    <columns>
        <TableColumn reorderable="false" onEditCommit="#onEditTable" text="Service">
            <cellValueFactory>
                <PropertyValueFactory property="service"/>
             </cellValueFactory>
             <cellFactory>
                 <TextFieldTableCell fx:factory="forTableColumn"/>
             </cellFactory>
         </TableColumn>
         <TableColumn reorderable="false" onEditCommit="#onEditTable" text="Username">
            <cellValueFactory>
                <PropertyValueFactory property="username"/>
             </cellValueFactory>
             <cellFactory>
                 <TextFieldTableCell fx:factory="forTableColumn"/>
             </cellFactory>
         </TableColumn>
    </columns>
<TableView>
例如,如果我编辑
Username
单元格,一切似乎都正常。但是如果我再次尝试编辑它,旧用户名将显示在文本字段中,
Entry
username
属性仍然是旧的

因此,如果我将
Username
单元格更改为
newUsername
,将
Service
单元格更改为
newService
,这就是输出:

Username: Username
Service: Service

Username: Username
Service: Service
这就是预期产出:

Username: newUsername
Service: Service

Username: newUsername
Service: newService

如何修复此问题?

问题是默认事件处理程序被覆盖。我通过在运行逻辑之前执行它来修复它:

public void initialize {
   tableView.getColumns().forEach(column -> {
       EventHandler handler = column.getOnEditCommit();

       handler.setOnEditCommit(event -> {
           handler.handle(event);

           onEditTable();
       });
   });
}

我还必须从FXML文档中的
表列
元素中删除
#onActionEvent=“onEditTable”

根据:“
属性值工厂
使用构造函数参数,
”firstName“
,假设
Person
有一个公共方法
firstNameProperty
,没有形式参数,返回类型为
observeValue
。。。如果不存在这样的方法,则
PropertyValueFactory
假定
Person
有一个公共方法
getFirstName
。。。在这种情况下,
TableCell
将无法观察到对
属性的更改(我的重点)。因此您应该使用Oh实现
条目
类,我没有注意到那里的
onEditCommit
处理程序。这些处理程序将替换默认的编辑提交处理程序(实际上更新数据)。你真的需要这些吗?通常你只需要听模型中的属性来对数据中的更改做出反应。继续@James_D注释:它有点隐藏(在TableView java doc的编辑块中,而不是像我们预期的那样在TableColumn中):如果调用TableColumn.setOnEditCommit,请注意这一点非常重要(javafx.event.EventHandler)使用自己的EventHandler,则将删除默认处理程序。除非随后处理对属性(或相关数据源)的写回,什么也不会发生。这并不奇怪,因为这是事件处理程序的一般约定:使用setOnXX将替换以前设置的内容。在设置之前,在列上调用
getOnEdit()
。这意味着您必须在控制器中设置它,而不是在FXML中
Username: newUsername
Service: Service

Username: newUsername
Service: newService
public void initialize {
   tableView.getColumns().forEach(column -> {
       EventHandler handler = column.getOnEditCommit();

       handler.setOnEditCommit(event -> {
           handler.handle(event);

           onEditTable();
       });
   });
}