You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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来显示字符串,这样能直接获取完整的用户对象,方便后续业务操作:

  1. 修改addUsser方法,直接添加用户对象:
fun addUsser(name: String, age: Int, date: LocalDate) {
    val user = Uzivatel(name, age, date)
    userList.add(user)
    // 存入User对象而非字符串
    usersListView.items.add(0, user)
}
  1. 设置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() ?: ""
        }
    }
}
  1. 获取选中的用户对象:
// 获取选中的完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:35:20