从文本字段输入中过滤JList [英] Filtering a JList from text field input

查看:86
本文介绍了从文本字段输入中过滤JList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

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

推荐答案

好吧,您可以创建方法来使用

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

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

When you need to filter, for example in the DocumentListener of 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

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.

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的一部分.


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

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

这篇关于从文本字段输入中过滤JList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆