面试题答案
一键面试- 定义数据模型:
- 首先定义一个数据类来表示待办事项。
data class TodoItem(val id: Int, var text: String)
- 这个类有一个唯一标识
id
和待办事项的文本text
。var
关键字表示text
可以被修改。
- 创建视图模型:
- 使用
ViewModel
来管理数据和状态。
class TodoViewModel : ViewModel() { val todoList = FXCollections.observableArrayList<TodoItem>() val newTodoText = SimpleStringProperty("") fun addTodo() { if (newTodoText.get().isNotEmpty()) { val newId = todoList.size + 1 val newTodo = TodoItem(newId, newTodoText.get()) todoList.add(newTodo) newTodoText.set("") } } fun removeTodo(todo: TodoItem) { todoList.remove(todo) } }
todoList
是一个可观察的ArrayList
,用于存储所有待办事项,这样当列表发生变化时,视图会自动更新。newTodoText
是一个SimpleStringProperty
,用于绑定输入框的文本,以便实时获取用户输入。addTodo
方法在用户点击添加按钮时被调用,它将新的待办事项添加到todoList
中,并清空输入框。removeTodo
方法在用户点击删除按钮时被调用,它从todoList
中移除指定的待办事项。
- 使用
- 创建视图:
class TodoView : View("Todo List") { val viewModel: TodoViewModel by inject() override val root = vbox { hbox { textfield(viewModel.newTodoText) button("Add") { action { viewModel.addTodo() } } } listview(viewModel.todoList) { cellFormat { hbox { label(it.text) button("Delete") { action { viewModel.removeTodo(it) } } } } } } }
textfield(viewModel.newTodoText)
将输入框与newTodoText
属性绑定,实现数据双向绑定,用户输入会实时更新newTodoText
,newTodoText
变化也会更新输入框。button("Add")
的action
调用viewModel.addTodo()
,当用户点击添加按钮时执行添加操作。listview(viewModel.todoList)
显示待办事项列表,cellFormat
为每个列表项设置布局,包含待办事项文本和删除按钮。删除按钮的action
调用viewModel.removeTodo(it)
,其中it
是当前列表项,实现删除功能。
通过上述代码,利用TornadoFX的数据绑定和响应式编程特性,实现了待办事项列表应用的添加和删除功能。