使用 setSelectedIndices 的 JList 搜索总是选择第一项

JList search with setSelectedIndices always selects first item

我刚刚开始学习 GUI,所以对于我的代码中的任何业余错误,我会过早地道歉。

我一直在尝试为 Jlist/JScrollPane window 实现一个简单的搜索选项,它突出显示包含搜索关键字的所有 Jlist 项目。搜索工作几乎如我所愿,除了列表中的第一项在每次新搜索中总是被选中,即使它不符合搜索条件。

这是搜索功能本身的代码片段(我尝试使用 ArrayList 而不是 Array,希望可以修复它,但没有成功):

    // Setup Search button/Assign Listener
    JButton btSearch = new JButton("Search");
    btSearch.addActionListener( (e) -> {
        String input = tfSearch.getText();
        int[] searchArray = new int[database.length];
        ArrayList<Integer> searchList = new ArrayList<>();

        for (int i=0; i<database.length; i++) //Search for entries that contain user input
            {
                if (database[i].contains(input))
                {
                    searchList.add(i);
                }
            }

        for (int i=0; i<searchList.size(); i++) //Convert ArrayList to Array
        {
            searchArray[i] = searchList.get(i);
        }

        lister.setSelectedIndices(searchArray);
        });

您创建了一个大小与 JList 相同的数组。所以它最初充满了零。然后用实际选定的索引覆盖数组的第一个元素。但是数组末尾仍然有零。

您需要创建一个仅包含所选索引的数组:

int[] searchArray = searchList.stream().mapToInt(Integer::intValue).toArray();

或者,如果您更喜欢 while 循环:

int[] searchArray = new int[searchList.size()];
for (int i = 0; i < searchList.size(); i++) {
    searchArray[i] = searchList.get(i);
}