【问题标题】:How to make a search button action event?如何制作搜索按钮动作事件?
【发布时间】:2020-03-06 13:53:53
【问题描述】:

GUI 有一个搜索栏,当用户键入一本书并单击搜索时,它会在JList 上弹出。但我不知道如何为它编写代码。

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

【问题讨论】:

  • 会不会像 bookListModel.getElement(String);

标签: java swing jbutton jtextfield jlist


【解决方案1】:

将原始未经过滤的数据保留在结构中(例如 ArrayList),并在搜索文本字段中添加 DocumentListener 以了解搜索文本是否已更改。然后,从JList的模型中过滤出原始数据和removeAllElements()。最后将过滤后的数据添加到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() 方法添加到按钮的动作监听器中。

【讨论】:

  • “它不适用于按钮,但是..” 但是没有!对 99%(1) 的情况进行搜索是更好的解决方案。 1)我为超过一百万个条目的 Unicode 字符集写了一个类似的东西。条目太多,有必要为它创建一个SwingWorker。但是为每个事件都创建 worker 并没有多大意义,因此代码启动了一个计时器来安排它。 (或者......你所做的更复杂的实现。)我可以通过添加一个动作监听器来解决这个问题。当用户在文本字段中按下“输入”时,搜索正在完成 ..
  • .. 但是 still 不需要按钮,因为 OP 最初使用的是!
【解决方案2】:

因此,每次按下按钮,您都可以:

  1. 用匹配搜索条件的字符串填充DefaultListModel
  2. 使用上一步的模型创建一个新的JList
  3. 弹出JOptionPane,其中包含上一步的列表作为消息。

示例代码:

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

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

        final String[] data = new String[]{"abcdef", "ABCdEF", "defGhi", "DEFghi"};

        final JTextField textField = new JTextField(20);

        final JButton searchButton = new JButton("Search");
        searchButton.addActionListener(e -> {
            final String searchText = textField.getText().toLowerCase();
            final DefaultListModel<String> model = new DefaultListModel<>();
            for (final String str: data)
                if (str.toLowerCase().contains(searchText))
                    model.addElement(str);
            final JList<String> list = new JList<>(model);
            JOptionPane.showMessageDialog(searchButton, list);
        });

        final JPanel panel = new JPanel();
        panel.add(textField);
        panel.add(searchButton);

        final JFrame frame = new JFrame("Search form");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2019-05-16
    • 1970-01-01
    • 2015-01-11
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多