【问题标题】:Filtering a JList from text field input从文本字段输入中过滤 JList
【发布时间】:2014-12-03 23:46:24
【问题描述】:

我有一个 JList 的文本字段,我需要根据用户在文本字段中输入的值过滤 JList 实体。

例如,如果 JList 的值为 {"one","two","three"...} 并且用户在文本字段中键入 "three",则 JList 应选择具有 "three" 值的行。

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

【问题讨论】:

    标签: java swing filtering jlist


    【解决方案1】:

    你可以创建方法来使用过滤掉的值

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

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

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

    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

    【讨论】:

    • +1 看起来像只有一列的 JTable 而没有 JTableHeader 仍然是更好的选择
    • @PaulSamsotha 我知道这是一篇旧帖子,但可以从 txt 文件中搜索吗?不是从静态列表中搜索
    • @AlexKolydas,我不明白为什么不,你只需要重构代码以将文件读入内存。但请记住 mKorbel 的评论;使用 JTable 而不是这个列表。这些表格带有内置的过滤 API。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多