JavaFX-Kotlin:如何从ListView获取选中项的值?
解决方案:获取ListView选中项的值
问题根源
你混淆了selectionMode和selectionModel的作用:selectionMode是用来配置ListView的选择规则(单选/多选),而获取选中项需要通过selectionModel。另外你当前把Uzivatel的字符串表示存入ListView,虽然能显示,但不利于后续对用户对象的操作,下面分两种情况解决:
方案1:基于现有代码快速修复
你的ListView当前存储的是String类型(user.toString()的结果),直接通过selectionModel.selectedItem就能获取选中的字符串:
// 直接获取当前选中的字符串项 val selectedUserStr = usersListView.selectionModel.selectedItem selectedUserStr?.let { println("选中项:$it") } // 或者添加选中状态变化的监听器,实时响应选择 usersListView.selectionModel.selectedItemProperty().addListener { _, _, newSelected -> newSelected?.let { println("用户选择了:$it") } }
方案2:更优的实现(直接存储用户对象)
把Uzivatel对象直接存入ListView,通过自定义CellFactory来显示字符串,这样能直接获取完整的用户对象,方便后续业务操作:
- 修改
addUsser方法,直接添加用户对象:
fun addUsser(name: String, age: Int, date: LocalDate) { val user = Uzivatel(name, age, date) userList.add(user) // 存入User对象而非字符串 usersListView.items.add(0, user) }
- 设置ListView的CellFactory,指定如何显示用户对象:
usersListView.cellFactory = Callback<ListView<Uzivatel>, ListCell<Uzivatel>> { object : ListCell<Uzivatel>() { override fun updateItem(item: Uzivatel?, empty: Boolean) { super.updateItem(item, empty) // 用toString()显示,也可以自定义显示格式(比如只显示姓名+年龄) text = item?.toString() ?: "" } } }
- 获取选中的用户对象:
// 获取选中的完整User对象 val selectedUser = usersListView.selectionModel.selectedItem selectedUser?.let { println("选中用户:姓名=${it.name},年龄=${it.age},生日=${it.date}") // 这里可以直接对User对象进行业务操作 } // 监听选中变化 usersListView.selectionModel.selectedItemProperty().addListener { _, _, newUser -> newUser?.let { println("当前选中用户:${it.name}") } }
内容的提问来源于stack exchange,提问作者mitas1c
相关产品推荐
相关产品推荐

