fun TableColumn.useComboBox(items: ObservableList, afterCommit: ((TableColumn.CellEditEvent) -> Unit)? = null): TableColumn { cellFactory = ComboBoxTableCell.forTableColumn(items) setOnEditCommit { val property = it.tableColumn.getCellObservableValue(it.rowValue) as Property property.value = it.newValue afterCommit?.invoke(it) } return this } inline fun TableColumn.useTextField(converter: StringConverter? = null, noinline afterCommit: ((TableColumn.CellEditEvent) -> Unit)? = null): TableColumn { when (T::class) { String::class -> { @Suppress("UNCHECKED_CAST") val stringColumn = this as TableColumn stringColumn.cellFactory = TextFieldTableCell.forTableColumn() } else -> { if (converter == null) throw IllegalArgumentException("You must supply a converter for non String columns") cellFactory = TextFieldTableCell.forTableColumn(converter) } } setOnEditCommit { val property = it.tableColumn.getCellObservableValue(it.rowValue) as ObjectProperty property.value = it.newValue afterCommit?.invoke(it) } return this }