Javafx 函数设置tableColumn.setOnEditCommit传递要设置为函数参数的项值

Javafx 函数设置tableColumn.setOnEditCommit传递要设置为函数参数的项值,javafx,kotlin,tableview,Javafx,Kotlin,Tableview,我希望能够用最少的重复代码设置JavaFXTableView列。除了setOnEditCommit的问题外,下面的示例会执行此操作。 非常感谢您的帮助 lateinit var tblDirs: TableView<SrcItem> lateinit var tcSrcItem: TableColumn<SrcItem, String> lateinit var tcDestItem: TableColumn<SrcItem, String> data cl

我希望能够用最少的重复代码设置JavaFXTableView列。除了setOnEditCommit的问题外,下面的示例会执行此操作。 非常感谢您的帮助

lateinit var tblDirs: TableView<SrcItem>
lateinit var tcSrcItem: TableColumn<SrcItem, String>
lateinit var tcDestItem: TableColumn<SrcItem, String>

data class SrcItem {
    var src: String = ""
    var dest: String = ""
    var destProperty
        get() = SimpleStringProperty(dest)
        set(value) {src = value.toString()}
    var srcProperty
        get() = SimpleStringProperty(src)
        set(value) {src = value.toString()}
}

private fun initTblDirs() {
    tblDirs.isEditable = true
    tcSrcItem = setupColumn(0, "src")
    tcDestItem = setupColumn(1, "dest")
}

fun setupColumn(col: Int, valName: String): TableColumn<SrcItem, String> {
    val tc = tblDirs.columns[col]  as TableColumn<SrcItem, String>
    tc.cellValueFactory = PropertyValueFactory<SrcItem, String>(valName)
    tc.cellFactory = TextFieldTableCell.forTableColumn();
    tc.setOnEditCommit { it.tableView.items[it.tablePosition.row].valName??? = it.newValue }
    tc.isEditable = true
    return tc
}
lateinit变量tblDirs:TableView
lateinit变量tcSrcItem:TableColumn
lateinit var tcDestItem:TableColumn
数据类SrcItem{
var src:String=“”
var dest:String=“”
var属性
get()=SimpleStringProperty(dest)
set(value){src=value.toString()}
srcProperty变量
get()=SimpleStringProperty(src)
set(value){src=value.toString()}
}
私人娱乐项目{
tblDirs.isEditable=true
tcSrcItem=setupColumn(0,“src”)
tcdestem=setupColumn(1,“dest”)
}
fun setupColumn(col:Int,valName:String):TableColumn{
val tc=tblDirs.columns[col]作为TableColumn
tc.cellValueFactory=PropertyValueFactory(valName)
tc.cellFactory=TextFieldTableCell.forTableColumn();
tc.setOnEditCommit{it.tableView.items[it.tablePosition.row].valName???=it.newValue}
tc.isEditable=true
返回tc
}
我无法找到将setupColumn()中的column value参数传递给setupColumn()中的setOnEditCommit的方法
任何帮助都将不胜感激。

传递一个函数,该函数接受编辑的项和新值,并设置相应的属性:
(SrcItem,String)->Unit
。然后,您可以在
onEditCommit
处理程序中使用适当的值调用此函数。谢谢,这很有效。虽然我仍然想知道是否可以通过只传递两个函数参数来实现——列号和列数据名。反射可能是可行的。是的,我可能有一天会研究这个问题,但目前我对反射一无所知。
lateinit var tblDirs: TableView<SrcItem>
lateinit var tcSrcItem: TableColumn<SrcItem, String>
lateinit var tcDestItem: TableColumn<SrcItem, String>

data class SrcItem {
    var src: String = ""
    var dest: String = ""
    var destProperty
        get() = SimpleStringProperty(dest)
        set(value) {src = value.toString()}
    var srcProperty
        get() = SimpleStringProperty(src)
        set(value) {src = value.toString()}
}

private fun initTblDirs() {
    tblDirs.isEditable = true
    tcSrcItem = setupColumn(0, "src")
    tcDestItem = setupColumn(1, "dest")
}

fun setupColumn(col: Int, valName: String): TableColumn<SrcItem, String> {
    val tc = tblDirs.columns[col]  as TableColumn<SrcItem, String>
    tc.cellValueFactory = PropertyValueFactory<SrcItem, String>(valName)
    tc.cellFactory = TextFieldTableCell.forTableColumn();
    tc.setOnEditCommit { it.tableView.items[it.tablePosition.row].valName??? = it.newValue }
    tc.isEditable = true
    return tc
}