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
相关产品推荐
相关产品推荐

