从文本字段输入中过滤JList

Moh*_*een 3 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);
 }            
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请参见如何使用表:排序和筛选

  • +1看起来像一个列的JTable,没有JTableHeader仍然是更好的选择 (3认同)