Как сделать событие действия кнопки поиска - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть строка поиска, которая, когда я набираю книгу и нажимаю кнопку поиска, появляется в Jlist, но я не знаю, как написать код для нее. Любое руководство ценится

public void actionPerformed(ActionEvent e) {
   if (e.getSource() == searchButton) {
       // Action for the SEARCH button

1 Ответ

0 голосов
/ 11 ноября 2019

Сохраните исходные нефильтрованные данные в структуре (например, ArrayList) и добавьте DocumentListener в текстовое поле поиска, чтобы узнать, был ли изменен текст поиска. Затем отфильтруйте исходные данные и removeAllElements() из модели JList. Наконец добавьте отфильтрованные данные к модели JList.

Пример:

public class SearchInJList extends JFrame implements DocumentListener {
    private static final long serialVersionUID = -1662279563193298340L;
    private JList<String> list;
    private List<String> data;
    private DefaultListModel<String> model;
    private JTextField searchField;

    public SearchInJList() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new BorderLayout());

        searchField = new JTextField();
        searchField.getDocument().addDocumentListener(this);
        add(searchField, BorderLayout.PAGE_START);

        createData();

        list = new JList<>(model = new DefaultListModel<>());
        data.forEach(model::addElement);
        add(new JScrollPane(list), BorderLayout.CENTER);

        setSize(500, 500);
        setLocationByPlatform(true);
    }

    private void createData() {
        data = new ArrayList<String>();
        for (int i = 0; i < 1000; i++) {
            String s = "String: " + i + ".";
            data.add(s);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            SearchInJList example = new SearchInJList();
            example.setVisible(true);
        });
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        search();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        search();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        search();
    }

    private void search() {
        List<String> filtered = data.stream().filter(s -> s.toLowerCase().contains(searchField.getText().toLowerCase()))
                .collect(Collectors.toList());

        model.removeAllElements();
        filtered.forEach(model::addElement);
    }
}

Это не работает с кнопкой, но я думаю, это то, что вы можете сделать. Я имею в виду добавить метод search() в слушатель действия кнопки.

...