Tornadofx tableview使用组合框和按钮上添加FXEvent
我需要帮助解决以下基本问题:
需求:
我有一个tableview可以编辑(内联),行也可以删除太多,如果需要一些复杂的操作点击一个按钮。
我的下面是三个小问题:
- 我用isEditable = true创建了一个tableview,并将列名称设置为可编辑的。 但是当我编辑,它不绑定到模型。 (必须缺少一件非常简单的事情)
- 编辑时,组合框显示选项,但选择一个值,抛出一个异常。
java.lang.ClassCastException:javafx.beans.property.SimpleStringProperty不能转换为javafx.beans.property.ObjectProperty
然后,我添加了一个删除按钮,这工作正常,当我取消tableView.items.removeAt(索引)
但是因为我想要一些额外的功能,我决定去FXEvent的火灾。 但是我应该如何在这里使用。
class MyView : View() { val warriorModel : WarriorModel by inject() val persons = FXCollections.observableArrayList<Warrior>( Warrior(1,"Tyrion Lannister", "M"), Warrior(2,"Ned Stark", "M"), Warrior(3,"Daenerys Targaryen", "F"), Warrior(4,"Arya Stark", "F") ) override val root = vbox { tableview(persons) { isEditable = true column("ID", Warrior::idProperty) column("Name", Warrior::nameProperty).makeEditable() column("Gender", Warrior::genderProperty).useComboBox(FXCollections.observableArrayList("M", "F")) column("Action", Warrior::dummyProperty).setCellFactory { DeleteButton<Warrior>() } bindSelected(warriorModel) subscribe<DeleteEvent> { event -> items.removeAt(event.index) } } } } class DeleteButton<Warrior>() : TableCell<Warrior, String?>() { internal val btn = Button("Delete") override fun updateItem(item: String?, empty: Boolean) { super.updateItem(item, empty) if (empty) { graphic = null text = null } else { btn.setOnAction { event: ActionEvent -> //tableView.items.removeAt(index) fire(DeleteEvent(index)) } graphic = btn text = null } } } class Warrior(id: Int, name: String, gender: String) { val idProperty = SimpleIntegerProperty(id) var id by idProperty val nameProperty = SimpleStringProperty(name) var name by nameProperty val genderProperty = SimpleStringProperty(gender) var gender by genderProperty val dummyProperty = SimpleStringProperty("") } class WarriorModel : ItemViewModel<Warrior>() { val id = bind { item?.idProperty } val name = bind { item?.nameProperty } val gender = bind { item?.genderProperty } } class DeleteEvent(val index: Int) : FXEvent()
要从Component
之外访问EventBus,请使用FX.eventbus
变量,然后触发该事件:
FX.eventbus.fire(DeleteEvent(index))
在更改组合框中的值时出现错误的原因是框架中的错误。 我刚刚提交了一个修复程序,但是您可以通过将此扩展函数添加到您的应用程序,直到1.5.10发行版解决它:
fun <S, T> TableColumn<S, T?>.useComboBoxWorking(items: ObservableList<T>, afterCommit: ((TableColumn.CellEditEvent<S, T?>) -> Unit)? = null): TableColumn<S, T?> { cellFactory = ComboBoxTableCell.forTableColumn(items) setOnEditCommit { val property = it.tableColumn.getCellObservableValue(it.rowValue) as Property<T?> property.value = it.newValue afterCommit?.invoke(it) } return this }
只需调用.useComboBoxWorking()
而不是现在,你应该是金:)
如果您不想使用解决方法,则可以暂时将Warrior
的genderProperty
更改为SimpleObjectProperty<String>
类型而不是SimpleStringProperty
作为替代方法。