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();
});
});
}