我无法弄清楚如何捕获 setOnEditCommit()
函数中的异常。
TableColumn<Property, Float> value_clm = new TableColumn<Property, Float>("Value");
value_clm.setCellValueFactory(new PropertyValueFactory<Property, Float>("value"));
value_clm.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter()));
value_clm.setSortable(false);
value_clm.setOnEditCommit(
new EventHandler<CellEditEvent<Property, Float>>() {
public void handle(CellEditEvent<Property, Float> t) {
try{
((Property) t.getTableView().getItems().get(t.getTablePosition().getRow())).setValue(t.getNewValue());
saved = false;
}catch(NumberFormatException e){
((Property) t.getTableView().getItems().get(t.getTablePosition().getRow())).setValue(t.getOldValue());
}
}
}
);
看看如果用户键入除“.”之外的非数字字符会发生什么情况。到文本字段并按 enter
抛出 NumberFormatException
,因此我尝试在抛出异常时执行 try/catch 来处理异常,但当用户按 enter
时,也会发生同样的情况。我不知道如何解决这个问题,但在触发 handle()
函数之前,似乎会检查 newValue
是否为 float
。我们的目标也是使用户无法键入除“.”之外的非数字字符。进入文本字段。
如果你们中的任何人可以提供帮助,我将非常感激。
最佳答案
答案是实现您自己的字符串到浮点转换器,因为默认转换器几乎只使用 Float.valueOf
,而不处理异常。
value_clm.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter()));
变成:
value_clm.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter() {
@Override
public Float fromString(String value) {
try {
return super.fromString(value);
} catch(NumberFormatException e) {
return Float.Nan; // An abnormal value
}
}
}));
然后您可以检查此异常值:
value_clm.setOnEditCommit(t -> {
if(t.getNewValue().isNaN()) {
t.getRowValue().setValue(t.getOldValue());
} else {
t.getRowValue().setValue(t.getNewValue());
}
});
关于JavaFX 无法捕获编辑提交功能中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278181/