我无法弄清楚如何在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来处理异常,但是当用户按下{{1}时会发生同样的事情}。我不知道如何解决这个问题,但似乎enter
在newValue
函数触发之前检查float
是否为handle()
。此外,目标是使用户不能键入除“。”之外的非数字字符。进入文本字段。
如果你们中的任何人能提供帮助,我会非常感激。
答案 0 :(得分:0)
答案是将你自己的字符串实现为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());
}
});