import javafx.beans.property.BooleanProperty import javafx.beans.property.SimpleBooleanProperty import javafx.collections.FXCollections import javafx.geometry.Insets import javafx.scene.control.TableView.CONSTRAINED_RESIZE_POLICY import javafx.scene.layout.Priority import tornadofx.* data class Item(val sku: String, val descr: String, val price: Float, val taxable: Boolean) class MyItemViewModel : ItemViewModel() { val taxable: BooleanProperty = bind { SimpleBooleanProperty(item?.taxable ?: false) } } class TableSelectView : View("TableSelectApp") { private val items = FXCollections.observableArrayList( Item("KBD-0455892", "Mechanical Keyboard", 100.0f, true), Item("145256", "Product Docs", 0.0f, false), Item("OR-198975", "O-Ring (100)", 10.0f, true) ) val mySelectedItem = MyItemViewModel() override val root = vbox(10.0) { tableview(items) { column("SKU", Item::sku) column("Item", Item::descr) column("Price", Item::price) column("Taxable", Item::taxable) bindSelected(mySelectedItem) setPrefSize(667.0, 376.0) columnResizePolicy = CONSTRAINED_RESIZE_POLICY vgrow = Priority.ALWAYS } hbox(8.0) { button("Inventory") { disableProperty().bind(mySelectedItem.empty) } button("Tax") { disableProperty().bind(mySelectedItem.empty.or(mySelectedItem.taxable.not())) } } padding = Insets(10.0) } } class TableSelectApp : App(TableSelectView::class)