从文本字段输入中过滤JList

时间:2014-10-09 06:31:48

标签: java swing filtering jlist

我有一个文本字段坚持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);
 }            

1 个答案:

答案 0 :(得分:13)

您可以创建使用

过滤掉值的方法

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

的方法
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);
            }
        }
    }
}

当您需要过滤时,例如在文本字段的DocumentListener中,只需获取文本字段的文本,然后调用此方法,传入模型和过滤字符串。像

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

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

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();
            }
        });
    }
}

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

请参阅How to Use Tables: Sorting and Filtering