通过 TableView 更新值时 ClassCast 异常

上下文:使用谷歌公交 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 和选项卡窗格中。我得到的堆栈跟踪没有指向我的代码,所以我不知所措。


ITMISS
浏览 136回答 1
1回答

慕莱坞森

您使用了原始类型,这使得编译成为可能,但在运行时发生了类型不一致。您routeColorCol应该显示javafx.scene.paint.Color值,但您的单元工厂回调被写入读取String值 - 这就是导致ClassCastException运行时的原因。来自TextFieldTableCell.forTableColumn():提供一个 TextField,允许在双击单元格时编辑单元格内容,或者在调用 TableView.edit(int, javafx.scene.control.TableColumn) 时编辑单元格内容。此方法仅适用于 String 类型的 TableColumn 实例。您应该使用重载方法TextFieldTableCell.forTableColumn(StringConverter)。routeColorCol.setCellFactory(&nbsp; &nbsp; TextFieldTableCell.<Foo, Color> forTableColumn(new StringConverter<Color>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public String toString(Color object) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return object != null ? object.toString() : "";&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public Color fromString(String string) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Color.valueOf(string);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java