为了账号安全,请及时绑定邮箱和手机立即绑定

通过 TableView 更新值时 ClassCast 异常

通过 TableView 更新值时 ClassCast 异常

ITMISS 2021-12-01 15:22:03
上下文:使用谷歌公交 GTFS API 的实验室。使用表格视图来显示路线数据,我想让数据可以从表格中编辑。当属性是字符串(路由 ID 和路由长名称)时,我已经成功地做到了这一点,但是使单元格可编辑的代码会引发非字符串属性的错误。表代码:table = new TableView<>();    ObservableList data = FXCollections.observableList(routes);    table.setItems(data);    table.setEditable(true);颜色数据列的代码:TableColumn routeColorCol = new TableColumn("Route Color");    routeColorCol.setCellValueFactory(new PropertyValueFactory("route_color"));    routeColorCol.setCellFactory(TextFieldTableCell.forTableColumn());    routeColorCol.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent>() {        @Override        public void handle(TableColumn.CellEditEvent t){            ((Route) t.getTableView().getItems().get(                    t.getTablePosition().getRow())            ).setRoute_color((Color)t.getNewValue());        }    });我将表格添加到 Vbox 和选项卡窗格中。我得到的堆栈跟踪没有指向我的代码,所以我不知所措。
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您使用了原始类型,这使得编译成为可能,但在运行时发生了类型不一致。您routeColorCol应该显示javafx.scene.paint.Color值,但您的单元工厂回调被写入读取String值 - 这就是导致ClassCastException运行时的原因。

来自TextFieldTableCell.forTableColumn()

提供一个 TextField,允许在双击单元格时编辑单元格内容,或者在调用 TableView.edit(int, javafx.scene.control.TableColumn) 时编辑单元格内容。此方法仅适用于 String 类型的 TableColumn 实例

您应该使用重载方法TextFieldTableCell.forTableColumn(StringConverter)

routeColorCol.setCellFactory(

    TextFieldTableCell.<Foo, Color> forTableColumn(new StringConverter<Color>() {

        @Override

        public String toString(Color object) {

            return object != null ? object.toString() : "";

        }


        @Override

        public Color fromString(String string) {

            return Color.valueOf(string);

        }

    }

));


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信