java 从文本字段输入中过滤 JList

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26271760/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 09:36:53  来源:igfitidea点击:

Filtering a JList from text field input

javaswingfilteringjlist

提问by Mohamed Bawaneen

i have a text field stick to jList1 and i need to filter j list entities depend on values entered by user in the text box like below if j list values {"one","two","three"......etc }if user entered "three" in the text box to pop up the list and select the row with three value to selected relating index.

我有一个文本字段坚持 jList1,我需要过滤 j 列表实体取决于用户在文本框中输入的值,如下所示如果 j 列表值{"one","two","three"......etc }如果用户在文本框中输入“三”以弹出列表并选择具有三个值的行到选定的相关索引。

private void jTbandnoActionPerformed(java.awt.event.ActionEvent evt)   
{                                         
     // TODO add your handling code here:
     String tXT=jTbandno.getText();
    jList2.collections.equal(tXt);
    int index = jList2.getSelectedIndex();
    JOptionPane.showMessageDialog(null, index);
 }            

回答by Paul Samsotha

Well you can create method to filter out the values by using

那么你可以创建方法来使用

Generally when dealing with data or components that use models, we should interact with the model and not the component. So you can have a method something like

通常在处理使用模型的数据或组件时,我们应该与模型而不是组件进行交互。所以你可以有一个类似的方法

private String[] defaultValues =  {
    "a", "ab", "abc", "abcd", "abcde", "abcdef", "absdefg", "abcdefgh",
    "abcdefghi", "abcdefghij", "abcdefghijk", "abcdefghijkl", "abcdefghijklm",
};

public void filterModel(DefaultListModel<String> model, String filter) {
    for (String s : defaultValues) {
        if (!s.startsWith(filter)) {
            if (model.contains(s)) {
                model.removeElement(s);
            }
        } else {
            if (!model.contains(s)) {
                model.addElement(s);
            }
        }
    }
}

When you need to filter, for example in the DocumentListenerof a text field, just get the text of the text field, and call this method, passing in the model and the filter string. Something like

当你需要过滤的时候,比如在DocumentListener一个文本字段的时候,只需要获取这个文本字段的文本,然后调用这个方法,传入模型和过滤字符串。就像是

private void filter() {
    String filter = field.getText();
    filterModel((DefaultListModel<String>)jList.getModel(), filter);
}

Here's a complete example. You may want to implement some more complicated filtering such as including sorting into search filter. This is just a simple case example.

这是一个完整的例子。您可能想要实现一些更复杂的过滤,例如将排序包括到搜索过滤器中。这只是一个简单的案例。

enter image description here

在此处输入图片说明

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DynamicListDemo {

    private String[] defaultValues =  {
        "a", "ab", "abc", "abcd", "abcde", "abcdef", "absdefg", "abcdefgh",
        "abcdefghi", "abcdefghij", "abcdefghijk", "abcdefghijkl", "abcdefghijklm",
    };
    private JList jList = createJList();

    public DynamicListDemo() {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(jList));
        frame.add(createTextField(), BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JTextField createTextField() {
        final JTextField field = new JTextField(15);
        field.getDocument().addDocumentListener(new DocumentListener(){
            @Override public void insertUpdate(DocumentEvent e) { filter(); }
            @Override public void removeUpdate(DocumentEvent e) { filter(); }
            @Override public void changedUpdate(DocumentEvent e) {}
            private void filter() {
                String filter = field.getText();
                filterModel((DefaultListModel<String>)jList.getModel(), filter);
            }
        });
        return field;
    }

    private JList createJList() {
        JList list = new JList(createDefaultListModel());
        list.setVisibleRowCount(6);
        return list;
    }

    private ListModel<String> createDefaultListModel() {
        DefaultListModel<String> model = new DefaultListModel<>();
        for (String s : defaultValues) {
            model.addElement(s);
        }
        return model;
    }

    public void filterModel(DefaultListModel<String> model, String filter) {
        for (String s : defaultValues) {
            if (!s.startsWith(filter)) {
                if (model.contains(s)) {
                    model.removeElement(s);
                }
            } else {
                if (!model.contains(s)) {
                    model.addElement(s);
                }
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new DynamicListDemo();
            }
        });
    }
}


UPDATE:As mKorbel pointed out the obvious, this may be a better use case for a JTablewith a single column, where sorting and filtering is already part of the API.

更新:正如 mKorbel 所指出的那样,这可能是一个更好的用例,用于JTable单列,其中排序和过滤已经是 API 的一部分。

See How to Use Tables: Sorting and Filtering

请参阅如何使用表格:排序和过滤