JavaFX无法在编辑提交函数中捕获异常

时间:2016-07-09 04:01:34

标签: java javafx

我无法弄清楚如何在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}时会发生同样的事情}。我不知道如何解决这个问题,但似乎enternewValue函数触发之前检查float是否为handle()。此外,目标是使用户不能键入除“。”之外的非数字字符。进入文本字段。

如果你们中的任何人能提供帮助,我会非常感激。

1 个答案:

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