我制作了一个可编辑表格。对于具有字符串属性的列,如下所示:
col_age.setCellFactory(TextFieldTableCell.forTableColumn());
col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
@Override
public void handle(CellEditEvent event) {
String a = event.getNewValue().toString();
int i = Integer.parseInt(a);
((Persona)event.getTableView().getItems().get(
event.getTablePosition().getRow()
)).setAge(i);
}
});
现在我想让列年龄可编辑。但年龄是一个整数。所以我尝试了这个:
col_age.setCellFactory(TextFieldTableCell.forTableColumn());
col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
@Override
public void handle(CellEditEvent event) {
String a = event.getNewValue().toString();
int i = Integer.parseInt(a);
((Persona)event.getTableView().getItems().get(
event.getTablePosition().getRow()
)).setAge(i);
}
});
但我收到以下错误消息:
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
有人可以帮助我吗?
谢谢。
最佳答案
TextFieldTableCell.forTableColumn()
仅适用于 TableColumn
与String
作为第二个类型参数,即 cellValueFactory
需要返回ObservableValue<String>
。 IntegerProperty
实现ObservableValue<Number>
。问题是单元格尝试将项目转换为 String
的结果。 .
您需要指定StringConverter
对于 String
之外的任何列项目类型:
col_age.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Number>() {
@Override
public String toString(Number value) {
return value == null ? "" : value.toString();
}
@Override
public Number fromString(String value) {
return (value == null) ? null : Integer.parseInt(value);
}
}));
这样你应该得到 Number
对于newValue
事件的属性:
col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
@Override
public void handle(CellEditEvent event) {
Number a = (Number) event.getNewValue();
((Persona)event.getTableView().getItems().get(
event.getTablePosition().getRow()
)).setAge(a.intValue());
}
});
关于java - 如何使用 IntegerProperty 在 JavaFX 中编辑单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54668339/