javafx-2 - Kotlin 中的 TableView 回调

标签 javafx-2 javafx-8 kotlin

我学习使用 JavaFX UI 控件 Example 12-12 Adding Map Data to the Table

它在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`
            }
        })
    }

关于javafx-2 - Kotlin 中的 TableView 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590959/

相关文章:

modal-dialog - JavaFX 2.2 模态窗口对话框 *with* FXML

JavaFX TableColumn 在可调整大小的列上设置PreferredWidth

java - 我的 JavaFX Slider 没有改变值,它看起来卡住了

javafx - JavaFX 8 中的 ScrollPane 始终具有灰色背景

popup - 舞台处于全屏模式时隐藏 JavaFX 弹出窗口

javafx-2 - 退出时保存 JavaFX 控件的状态

java - 如何在 javaFx 中更新 java-124 版本后解决 TableView 中的嵌套列?

android - 角球选手videoview kotlin

java - 是否可以在 Android 项目中运行最新版本的 Akka 框架(2.5.2)?

kotlin - 如何在Kotlin中构建jacoco测试报告任务(第5级)