import javafx.beans.property.SimpleBooleanProperty import javafx.beans.property.SimpleStringProperty import javafx.collections.FXCollections import javafx.collections.ObservableList import tornadofx.* class TodoApplication : App(MainView::class) class MainController : Controller() { val tasks: ObservableList = FXCollections.observableArrayList() fun addNewTask(content: String) { val task = Task(false, content) tasks.add(task) } } class MainView : View("checKmark") { val controller: MainController by inject() override val root = vbox { listview(controller.tasks) { setPrefSize(300.0, 200.0) cellFormat { graphic = checkbox(property = itemProperty().select(Task::completedProperty)) { textProperty().bind(itemProperty().select(Task::contentProperty)) } } } label("What do you need TODO?") textfield { setOnAction { controller.addNewTask(text) clear() } } } } class Task(completed: Boolean, content: String) { val contentProperty = SimpleStringProperty(content) var content by contentProperty val completedProperty = SimpleBooleanProperty(completed) var completed by completedProperty override fun toString() = "[${if(completed) "X" else " "}] $content" }