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

Java+Scenebuilder开发音乐播放器,搜索后如何高亮ListView对应行?

JavaFX ListView 搜索后自动高亮选中行解决方案

问题核心原因

JavaFX 中 ListView 的焦点定位和选中高亮是两套独立逻辑:

  • FocusModel 仅负责控件内部的焦点标记,不会触发选中态的样式渲染,所以不会出现高亮效果
  • 高亮选中效果由 SelectionModel 控制,需要调用选中相关的接口实现

修复后代码

@FXML
private ListView<String> listBox;
private ObservableList<String> list = FXCollections.observableArrayList();

@FXML
private void searchMusic(ActionEvent event) {
    // 提前存储搜索关键词,避免重复调用取值方法
    String targetSong = searchTextBox.getText();
    String searchResult = avl.Find(targetSong);

    if ("found!".equals(searchResult)) {
        labelFind.setText("Found!");
        int searchInd = listBox.getItems().indexOf(targetSong);
        // 校验索引合法性,避免索引为-1时出现报错
        if (searchInd >= 0) {
            // 选中目标行,触发系统默认的高亮样式
            listBox.getSelectionModel().select(searchInd);
            // 若目标行不在当前可视区域,自动滚动到对应位置
            listBox.scrollTo(searchInd);
            // 可选:保留原有的焦点定位逻辑
            listBox.getFocusModel().focus(searchInd);
            currentSong.setText(listBox.getSelectionModel().getSelectedItem());
        }
    } else {
        labelFind.setText("There is no such song.");
    }
}

可选补充说明

如果你的项目自定义了ListView的单元格样式,需要确保CSS规则中.list-cell:selected的高亮样式没有被覆盖,否则选中后也可能看不到预期的高亮效果。默认的单选模式已经满足普通音乐播放器的选中需求,如果需要支持多选,可以在初始化时添加listBox.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);配置。

内容的提问来源于stack exchange,提问作者koji tanaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:54:04