【问题标题】:How can I edit a Cell in JavaFX with IntegerProperty?如何使用 IntegerProperty 在 JavaFX 中编辑单元格?
【发布时间】:2019-02-13 10:47:17
【问题描述】:

我制作了一个可编辑的表格。对于具有字符串属性的列,请执行以下操作:

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

但我收到以下错误消息:

原因:java.lang.ClassCastException:java.lang.Integer 不能 转换为 java.lang.String

有人可以帮我吗?

谢谢。

【问题讨论】:

  • a) 您需要将 textFieldTableCell 与转换器一起使用,请参阅 api 文档 b) 如果您仍然卡住,请提供一个 minimal reproducible example 来说明问题(很可能是您的表'未按预期设置)c)与您的问题无关:请学习 java 命名约定并遵守它们

标签: java javafx


【解决方案1】:

TextFieldTableCell.forTableColumn() 仅适用于TableColumns,String 作为第二个类型参数,即cellValueFactory 需要返回ObservableValue&lt;String&gt;IntegerProperty 实现 ObservableValue&lt;Number&gt;。问题是单元格尝试将项目转换为 String 的结果。

您需要为除String 之外的任何列项类型指定StringConverter

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

}));

这样您应该为事件的newValue 属性获得Number

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

【讨论】:

  • 您好,非常感谢。现在我遇到了方法 fromString(...) 的问题。如果使用字母(例如“z”)编辑年龄列,我会收到一条错误消息。问题是 fromString() 方法。所以我尝试了{}catch(){}。但在捕获部分我必须返回一个数字。你知道如何设置单元格的旧值吗?或者如何避免错误信息?
猜你喜欢
  • 2013-10-20
  • 2014-09-04
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多