过滤从文本字段中输入

过滤从文本字段中输入

问题描述:

我有一个文本字段棍子jList1,我需要 过滤器的JList实体依赖于用户在文本框中 进入如下图所示的值如果j值列表{"one","two","three"......etc } 如果用户输入“一个JList三个“来弹出列表,并选择具有三个值 的行到选定的相关索引。过滤从文本字段中输入

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

那么您可以创建方法通过使用

一般用数据或使用模型组件打交道时,我们应该与模型进行交互而不是组件。所以,你可以有一个方法类似

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

UPDATE:作为mKorbel指出明显,这可能是更好的用例与单个列,其中排序和过滤一个JTable是已经部分API。

How to Use Tables: Sorting and Filtering

+3

+1好像作为JTable中有一列,无JTableHeader上仍然是更好的选择 – mKorbel 2014-10-09 07:11:26

+0

@mKorbel :-D当然,我在想什么! – 2014-10-09 07:12:35

+0

谢谢你很多Peeskillet我会检查和恢复 – 2014-10-09 14:23:46