当前位置: 首页 > 知识库问答 >
问题:

如何在JList中按属性搜索项

步德宇
2023-03-14
  ArrayList<Item> backUp = new ArrayList<>();
            ArrayList<Item> itemsFound = new ArrayList<>();

            for (int i = 0; i < listModel.getSize(); i++) {
                backUp.add(listModel.getElementAt(i));

                if (listModel.getElementAt(i).getName().compareToIgnoreCase(nameToSearch) >= 0) {
                    Item foundItem = listModel.getElementAt(i);
                    itemsFound.add(foundItem);
                }
            }
                //clear the listModel to display the found items
                listModel.removeAllElements();
                //add the found items to the listModel to be displayed
                for (Item s: itemsFound) {
                    listModel.addElement(s);}

共有1个答案

惠泳
2023-03-14

一个非常简单的解决方案可以是:

  1. 将所有项存储到首选项的集合或数组中。
  2. JList
  3. 使用DefaultListModel(以编程方式动态)。
  4. 对于每个搜索操作,清除模型,然后一个接一个地添加符合搜索条件的项。

例如:

import java.awt.BorderLayout;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Main {

    //Assuming the class Item is similar to the following implementation:
    public static class Item {
        private final String name;

        public Item(final String name) {
            this.name = Objects.requireNonNull(name);
        }

        public String getName() {
            return name;
        }

        //Overriding toString method, to avoid implementing a custom ListCellRenderer...
        @Override
        public String toString() {
            return getName();
        }
    }

    public static void main(final String[] args) {

        //The following list contains all the initial Items lets say:
        final List<Item> allItems = Arrays.asList(new Item("abc"), new Item("ABC"),
                                                  new Item("def"), new Item("DEF"));

        //Create a DefaultListModelof Items (which is programmatically dynamic):
        final DefaultListModel<Item> listModel = new DefaultListModel<>();

        //Supply the model to the list on creation time (or later with setModel):
        final JList<Item> list = new JList<>(listModel);

        //Initialize the listModel to initially contain all items:
        allItems.forEach(item -> listModel.addElement(item));

        final JTextField searchField = new JTextField(10);
        final JButton searchButton = new JButton("Search");
        searchButton.addActionListener(e -> {
            final String searchText = searchField.getText();
            listModel.clear();
            if (searchText.isEmpty()) //If the search text field is empty, lets say we want to display all values:
                allItems.forEach(item -> listModel.addElement(item));
            else
                allItems.forEach(item -> {
                    if (item.getName().equalsIgnoreCase(searchText))
                        listModel.addElement(item);
                });
        });
        final JPanel pageStart = new JPanel(); //FlowLayout
        pageStart.add(searchField);
        pageStart.add(searchButton);
        final JPanel all = new JPanel(new BorderLayout());
        all.add(pageStart, BorderLayout.PAGE_START);
        all.add(new JScrollPane(list), BorderLayout.CENTER);
        final JFrame frame = new JFrame("Searchable JList");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(all);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
 类似资料:
  • 问题内容: 如何通过属性区分已发布的OSGI服务,这些服务实现了相同的接口? 问题答案: 假设您要基于属性的某些值来检索注册的服务,则需要使用 过滤器 (基于LDAP语法)。 例如: 您想在其中查找实现且属性值等于的服务。 这是获取参考的相关javadoc。 备注1: 上面的示例和javadoc引用了发行版4.2。如果您不限于J2SE 1.4运行时,建议您看一下Release 4.3 语法,您可以

  • 也尝试用 http://localhost:8080/auth/admin/realms/demo-realm/users/?search=akshay

  • 问题内容: 可以说我们有一个名为acls的类,该类有一个名为lprop的List属性。 现在,让我说我还有另一个列表,其值分别为1,3,5,并且说此变量名称为tosearch。 我想通过使用巢来搜索elasticsearch索引中的acls类型记录lprop属性中的tosearch值,并且仅找到一个匹配项就足够了。 例如: 问题答案: 使用查询

  • 我正在构建一个实用程序函数,它应该搜索属性名称,并在找到后返回其值。它应该递归地执行此操作: 但是,控制台日志将永远消失,浏览器将崩溃。我做错了什么? 编辑: 这就是我调用函数的方式:

  • 但我得到以下错误: 我错在哪里?

  • 我还没有为索引创建任何显式设置。谢了。