Java 通过TableView更新值时发生ClassCast异常

Java 通过TableView更新值时发生ClassCast异常,java,javafx,gtfs,Java,Javafx,Gtfs,上下文:使用google transit GTFS API的实验室。使用表视图显示路线数据,我希望使数据可以从表中编辑。当属性是字符串(路由ID和路由长名称)时,我成功地做到了这一点,但使单元格可编辑的代码会为非字符串属性抛出一个错误 表代码: table = new TableView<>(); ObservableList data = FXCollections.observableList(routes); table.setItems(data);

上下文:使用google transit GTFS API的实验室。使用表视图显示路线数据,我希望使数据可以从表中编辑。当属性是字符串(路由ID和路由长名称)时,我成功地做到了这一点,但使单元格可编辑的代码会为非字符串属性抛出一个错误

表代码:

table = new TableView<>();
    ObservableList data = FXCollections.observableList(routes);
    table.setItems(data);
    table.setEditable(true);
table=newtableview();
ObservableList data=FXCollections.ObservableList(路由);
表2.设置项目(数据);
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());
        }
    });
TableColumn routeColorCol=新的TableColumn(“路线颜色”);
routeColorCol.setCellValueFactory(新属性ValueFactory(“route_color”));
RouteColor.setCellFactory(TextFieldTableCell.forTableColumn());
setOnEditCommit(新的EventHandler(){
@凌驾
公共无效句柄(TableColumn.CellEditEvent t){
((路由)t.getTableView().getItems().get(
t、 getTablePosition().getRow())
).setRoute_color((color)t.getNewValue());
}
});
我将表添加到Vbox和选项卡窗格中。我得到的stacktrace没有指向我的代码,所以我不知所措

堆栈跟踪:

Oct 21, 2018 4:39:37 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 9.0.1 by JavaFX runtime of version 8.0.141
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.paint.Color cannot be cast to java.lang.String
at javafx.util.converter.DefaultStringConverter.toString(DefaultStringConverter.java:34)
at javafx.scene.control.cell.CellUtils.getItemText(CellUtils.java:100)
at javafx.scene.control.cell.CellUtils.updateItem(CellUtils.java:201)
at javafx.scene.control.cell.TextFieldTableCell.updateItem(TextFieldTableCell.java:204)
at javafx.scene.control.TableCell.updateItem(TableCell.java:663)
at javafx.scene.control.TableCell.indexChanged(TableCell.java:468)
at javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:116)
at com.sun.javafx.scene.control.skin.TableViewSkin.resizeColumnToFitContent(TableViewSkin.java:241)
at com.sun.javafx.scene.control.skin.TableViewSkin.resizeColumnToFitContent(TableViewSkin.java:54)
at com.sun.javafx.scene.control.skin.TableColumnHeader.doColumnAutoSize(TableColumnHeader.java:531)
at com.sun.javafx.scene.control.skin.TableColumnHeader.updateScene(TableColumnHeader.java:474)
at com.sun.javafx.scene.control.skin.TableColumnHeader.handlePropertyChanged(TableColumnHeader.java:314)
at com.sun.javafx.scene.control.skin.TableColumnHeader.lambda$new$49(TableColumnHeader.java:149)
at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(MultiplePropertyChangeListenerHandler.java:55)
at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
at javafx.scene.Node$ReadOnlyObjectWrapperManualFire.fireSuperValueChangedEvent(Node.java:831)
at javafx.scene.Node.invalidatedScenes(Node.java:883)
at javafx.scene.Node.setScenes(Node.java:921)
at javafx.scene.Parent$1.onChanged(Parent.java:269)
at com.sun.javafx.collections.TrackableObservableList.lambda$new$29(TrackableObservableList.java:45)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.collections.ModifiableObservableListBase.setAll(ModifiableObservableListBase.java:90)
at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:116)
at com.sun.javafx.scene.control.skin.NestedTableColumnHeader.updateContent(NestedTableColumnHeader.java:487)
at com.sun.javafx.scene.control.skin.NestedTableColumnHeader.updateTableColumnHeaders(NestedTableColumnHeader.java:317)
at com.sun.javafx.scene.control.skin.NestedTableColumnHeader.checkState(NestedTableColumnHeader.java:544)
at com.sun.javafx.scene.control.skin.NestedTableColumnHeader.computePrefHeight(NestedTableColumnHeader.java:427)
at javafx.scene.Parent.prefHeight(Parent.java:929)
at javafx.scene.layout.Region.prefHeight(Region.java:1435)
at com.sun.javafx.scene.control.skin.TableHeaderRow.computePrefHeight(TableHeaderRow.java:331)
at com.sun.javafx.scene.control.skin.TableHeaderRow.computeMinHeight(TableHeaderRow.java:324)
at javafx.scene.Parent.minHeight(Parent.java:957)
at javafx.scene.layout.Region.minHeight(Region.java:1401)
at javafx.scene.control.SkinBase.computeMinHeight(SkinBase.java:254)
at javafx.scene.control.Control.computeMinHeight(Control.java:489)
at javafx.scene.Parent.minHeight(Parent.java:957)
at javafx.scene.layout.Region.minHeight(Region.java:1401)
at javafx.scene.layout.Region.computeChildMinAreaHeight(Region.java:1697)
at javafx.scene.layout.VBox.getAreaHeights(VBox.java:436)
at javafx.scene.layout.VBox.computeContentHeight(VBox.java:518)
at javafx.scene.layout.VBox.computeMinHeight(VBox.java:396)
at javafx.scene.Parent.minHeight(Parent.java:957)
at javafx.scene.layout.Region.minHeight(Region.java:1401)
at javafx.scene.layout.Region.computeChildPrefAreaHeight(Region.java:1762)
at javafx.scene.layout.AnchorPane.computeHeight(AnchorPane.java:297)
at javafx.scene.layout.AnchorPane.computeMinHeight(AnchorPane.java:246)
at javafx.scene.Parent.minHeight(Parent.java:957)
at javafx.scene.layout.Region.minHeight(Region.java:1401)
at javafx.scene.layout.Region.boundedNodeSizeWithBias(Region.java:1917)
at javafx.scene.layout.Region.layoutInArea(Region.java:2323)
at javafx.scene.layout.Region.layoutInArea(Region.java:2238)
at javafx.scene.layout.Region.layoutInArea(Region.java:2179)
at javafx.scene.layout.StackPane.layoutChildren(StackPane.java:342)
at javafx.scene.Parent.layout(Parent.java:1087)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Scene.doLayoutPass(Scene.java:552)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.paint.Color cannot be cast to java.lang.String
at javafx.util.converter.DefaultStringConverter.toString(DefaultStringConverter.java:34)
at javafx.scene.control.cell.CellUtils.getItemText(CellUtils.java:100)
at javafx.scene.control.cell.CellUtils.updateItem(CellUtils.java:201)
at javafx.scene.control.cell.TextFieldTableCell.updateItem(TextFieldTableCell.java:204)
at javafx.scene.control.TableCell.updateItem(TableCell.java:663)
at javafx.scene.control.TableCell.indexChanged(TableCell.java:468)
at javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:116)
at com.sun.javafx.scene.control.skin.TableRowSkinBase.updateCells(TableRowSkinBase.java:533)
at com.sun.javafx.scene.control.skin.TableRowSkinBase.init(TableRowSkinBase.java:147)
at com.sun.javafx.scene.control.skin.TableRowSkin.<init>(TableRowSkin.java:64)
at javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:212)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Node.processCSS(Node.java:9058)
at javafx.scene.Node.applyCss(Node.java:9155)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1964)
at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1797)
at com.sun.javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1879)
at com.sun.javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2528)
at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1189)
at javafx.scene.Parent.layout(Parent.java:1087)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Parent.layout(Parent.java:1093)
at javafx.scene.Scene.doLayoutPass(Scene.java:552)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
2018年10月21日下午4:39:37 javafx.fxml.fxmloader$ValueElement processValue
警告:由版本8.0.141的JavaFX运行时加载带有版本9.0.1的JavaFXAPI的FXML文档
线程“JavaFX应用程序线程”java.lang.ClassCastException中的异常:JavaFX.scene.paint.Color不能转换为java.lang.String
位于javafx.util.converter.DefaultStringConverter.toString(DefaultStringConverter.java:34)
位于javafx.scene.control.cell.CellUtils.getItemText(CellUtils.java:100)
位于javafx.scene.control.cell.CellUtils.updateItem(CellUtils.java:201)
位于javafx.scene.control.cell.TextFieldTableCell.updateItem(TextFieldTableCell.java:204)
位于javafx.scene.control.TableCell.updateItem(TableCell.java:663)
位于javafx.scene.control.TableCell.indexChanged(TableCell.java:468)
位于javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:116)
位于com.sun.javafx.scene.control.skin.TableViewSkin.ResizeColumntOffitContent(TableViewSkin.java:241)
位于com.sun.javafx.scene.control.skin.TableViewSkin.ResizeColumntOffitContent(TableViewSkin.java:54)
位于com.sun.javafx.scene.control.skin.TableColumnHeader.doColumnAutoSize(TableColumnHeader.java:531)
位于com.sun.javafx.scene.control.skin.TableColumnHeader.updateScene(TableColumnHeader.java:474)
位于com.sun.javafx.scene.control.skin.TableColumnHeader.handlePropertyChanged(TableColumnHeader.java:314)
位于com.sun.javafx.scene.control.skin.TableColumnHeader.lambda$new$49(TableColumnHeader.java:149)
位于com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(MultiplePropertyChangeListenerHandler.java:55)
位于javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)
位于com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
位于com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
位于javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
位于javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
在javafx.scene.Node$ReadOnlyObjectWrapperManualFire.fireSuperValueChangedEvent(Node.java:831)
位于javafx.scene.Node.invalidatedScenes(Node.java:883)
位于javafx.scene.Node.setScenes(Node.java:921)
位于javafx.scene.Parent$1.onChanged(Parent.java:269)
在com.sun.javafx.collections.trackableobserveList.lambda$new$29(trackableobserveList.java:45)
位于com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
位于com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
位于javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
位于javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
位于javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
位于javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
位于javafx.collections.ModifiableObservableListBase.setAll(ModifiableObservableListBase.java:90)
位于com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:116)
位于com.sun.javafx.scene.control.skin.NestedTableColumnHeader.updateContent(NestedTableColumnHeader.java:487)
位于com.sun.javafx.scene.control.skin.NestedTableColumnHeader.UpdateTableColumnHeader(NestedTableColumnHeader.java:317)
位于com.sun.javafx.scene.control.skin.NestedTableColumnHeader.checkState(NestedTableColumnHeader.java:544)
位于com.sun.javafx.scene.control.skin.NestedTableColumnHeader.computePrefHeight(NestedTableColumnHeader.java:427)
位于javafx.scene.Parent.prefHeight(Parent.java:929)
位于javafx.scene.layout.Region.prefHeight(Region.java:1435)
位于com.sun.javafx.scene.control.skin.TableHeaderRow.computePrefHeight(TableHeaderRow.java:331)
位于com.sun.javafx.scene.control.skin.TableHeaderRow.ComputeMinHight(TableHeaderRow.java:324)
位于javafx.scene.Parent.minHeight(Parent.java:957)
位于javafx.scene.layout.Region.minHeight(Region.java:1401)
位于javafx.scene.control.SkinBase.computeMinHeight(SkinBase.java:254)
位于javafx.scene.control.control.computeMinHeight(control.java:489)
位于javafx.scene.Parent.minHeight(Parent.java:957)
位于javafx.scene.layout.Region.minHeight(Region.java:1401)
位于javafx.scene.layout.Region.computeChildMinAreaHeight(Region.java:1697)
位于javafx.scene.layout.VBox.getAreaHeights(VBox.java:436)
位于javafx.scene.layout.VBox.computeContentHeight(VBox.java:518)
位于javafx.scene.layout.VBox.computeMinHeight(VBox.java:396)
位于javafx.scene.Parent.minHeight(Parent.java:957)
位于javafx.scene.layout.Region.minHeight(Region.java:1401)
位于javafx.scene.layout.Region.computeChildPrefAreaHeight(Region.java:1762)
在javafx.scene.layout.AnchorPane.computeHeight(AnchorPane.java:297)
在javafx.scene.layo
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);
        }
    }
));