【问题标题】:Searching a JList in Java在 Java 中搜索 JList
【发布时间】:2012-08-12 09:15:48
【问题描述】:

我正在尝试使用 Java 中的 JList 创建搜索功能。我在插入到 JList 的 ListModel 中有一个联系人列表。它可以很好地显示所有联系人。但是,我在联系人列表上方有一个搜索框,并希望将联系人缩小到用户在输入时在搜索框中输入的内容(如 Google 搜索)。但是,当我尝试在搜索框中输入时,所有联系人都会消失,然后我也无法退格。我的 KeyListener 代码如下:

KeyListener klisten = new KeyListener() 
    {
        public void keyPressed(KeyEvent evt) 
        {
            searchResults = new ContactList();
            listModel.removeAllElements();
            searchResults.addContact(contactList.getContact(evt.getKeyChar()));
            for (int i = 0; i < searchResults.getContacts().size(); i++)
            {
                listModel.addElement(searchResults.getContact(i).getFname() + " " + searchResults.getContact(i).getLname());
            }
            contacts = new JList(listModel);
            contacts.validate();
        }
        public void keyReleased(KeyEvent evt) {} 
        public void keyTyped(KeyEvent evt) {}
    };
    searchField.addKeyListener(klisten);

EDIT** 包含所有原始联系人的原始 ListModel 在此匿名类之前声明,称为 listModel,我在此类中重用它来替换完整的联系人列表..

任何解决此问题的帮助都会有很大帮助。如果我需要发布我的代码的其他部分,请告诉我。

【问题讨论】:

  • 首先,你真的不应该为此使用KeyListener,而是在文本字段上尝试DocumentListener

标签: java swing jlist keylistener


【解决方案1】:

如果没有其余代码,很难看到逻辑。考虑发布SSCCE。看起来您正在关键侦听器事件中重新创建 JList

contacts = new JList(listModel);

需要将新列表添加/重新添加到容器中。看起来不需要重新创建列表,因为 listModel 是最新的,它应该通知列表刷新更改,除非 searchResults 为空。不看代码,只是猜测。

使用带有过滤支持的单列JTable 可能更容易。有关详细信息,请参阅Sorting and Filtering

【讨论】:

    【解决方案2】:

    我已经快速阅读了,老实说,没有太多内容。

    我不确定这个方法的结果

    searchResults.addContact(contactList.getContact(evt.getKeyChar()));
    

    这对我来说表明没有可用的联系人

    searchResults = new ContactList();
    

    但那是因为我缺少上下文。

    更好的解决方案可能是使用“代理”模型,基本上是一个包装模型的模型,它为您提供过滤器功能,或者按照 Max 的建议,JTable

    【讨论】:

      【解决方案3】:

      考虑使用支持列表过滤的框架,例如 f.i. SwingX

      那么基本的步骤是:

      • 实现基于名称 sn-ps 过滤联系人的 RowFilter
      • 为 textField 安装 DocumentListener
      • 根据文档的更改通知,在列表中安装新过滤器

      伪代码sn-p

      // the custom RowFilter
      public class ContactRowFilter extends RowFilter {
          private String compare;
      
          public ContactRowFilter(String compare) {
              this.compare = compare;
          }
      
          public boolean include(Entry entry) {
              Contact contact = (Contact) entry.getValue(0);
              return contact.getName().contains(compare);
          }
      }
      
      // custom documentListener
      public class SearchFieldListener implements DocumentListener {
          private JXList list;
      
          public SearchFieldListener(JXList list) {
              this.list = list;
          }
      
          @Override
          public void insertUpdate(...) {
              updateFilter(evt.getDocument());
          }
          ....
          protected void updateFilter(Document doc) {
              String text = doc.getText(0, doc.getLength());
              list.setRowFilter(text.length > 0 ?
                  new ContactRowFilter(text) : null);
          }
      
      }
      
      // usage
      JXList list = new JXList(myModel);
      list.setAutoCreateRowSorter(true);
      DocumentListener listener = new SearchFieldListener(list);
      JTextField searchField = new JTextField(20);
      searchField.getDocument().addDocumentListener(listener); 
      

      【讨论】:

        猜你喜欢
        • 2012-02-13
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        相关资源
        最近更新 更多