Kotlin中的TableView回调
我学习使用JavaFX UI控件示例12-12将地图数据添加到表中
它在java中的作品:
TableColumn<Map, String> firstDataColumn = new TableColumn<>("Class A"); TableColumn<Map, String> secondDataColumn = new TableColumn<>("Class B"); firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey)); firstDataColumn.setMinWidth(130); secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey)); secondDataColumn.setMinWidth(130); TableView table_view = new TableView<>(generateDataInMap()); table_view.setEditable(true); table_view.getSelectionModel().setCellSelectionEnabled(true); table_view.getColumns().setAll(firstDataColumn, secondDataColumn); Callback<TableColumn<Map, String>, TableCell<Map, String>> cellFactoryForMap = new Callback<TableColumn<Map, String>, TableCell<Map, String>>() { @Override public TableCell call(TableColumn p) { return new TextFieldTableCell(new StringConverter() { @Override public String toString(Object t) { return t.toString(); } @Override public Object fromString(String string) { return string; } }); } }; firstDataColumn.setCellFactory(cellFactoryForMap); secondDataColumn.setCellFactory(cellFactoryForMap);
但是这部分不能在kotlin中(转换后):
val cellFactoryForMap = object : Callback<TableColumn<Map<*, *>, String>, TableCell<Map<*, *>, String>> { override fun call(p: TableColumn<*, *>): TableCell<*, *> { return TextFieldTableCell(object : StringConverter() { override fun toString(t: Any): String { return t.toString() } override fun fromString(string: String): Any { return string } }) } }
错误:(49,33)Kotlin:对象必须被声明为抽象或实现抽象成员public abstract fun call(p0:TableColumn>,String>!):TableCell,*>,String>! 在javafx.util.Callback中定义
错误:(50,13)Kotlin:'call'没有覆盖任何东西
错误:(51,24)Kotlin:类型推断失败:构造函数TextFieldTableCell(p0:StringConverter!)不能应用于()
错误:(51,43)Kotlin:类型不匹配:推断的类型只是StringConverter <(??? .. ???)>! 预计
错误:(51,52)Kotlin:在javafx.util中定义的类StringConverter的一个类型参数
错误:(52,21)Kotlin:'toString'不会覆盖任何内容
错误:(56,21)Kotlin:'fromString'不包含任何内容
如何编写正确的代码?
您的类型在TextFieldTableCell中是错误的。
仔细看TextFieldTableCell<S,T> extends TableCell<S,T>
和方法TextFieldTableCell(StringConverter<T> converter)
如果回调返回类型是TableCell<Map<*, *>, String>>
,那么你的字符串转换器必须是StringConverter<String>
来完成类型约束。
Callback<TableColumn<Map<*, *>, String>, TableCell<Map<*, *>, String>> { TextFieldTableCell(object: StringConverter<String>() { override fun fromString(string: String): String { return string } override fun toString(`object`: String): String { return `object` } }) }