簡體   English   中英

在Java中搜索JList

[英]Searching a JList in Java

我正在嘗試使用Java中的JList創建搜索功能。 我在ListModel中有一個聯系人列表,我插入到JList ..這顯示所有聯系人就好了。 但是,我在聯系人列表上方有一個搜索框,並希望將聯系人縮小到用戶在鍵入時在搜索框中輸入的內容(如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);

編輯**包含所有原始聯系人的原始ListModel在此匿名類之前聲明,並被稱為listModel,我在此類中重用它來替換完整的聯系人列表。

任何幫助解決這個問題都會有很大的幫助。 如果我需要發布代碼的其他部分,請告訴我。

沒有剩下的代碼就很難看到邏輯。 考慮發布SSCCE 看起來您正在JList密鑰監聽器事件中重新創建JList

contacts = new JList(listModel);

需要將新列表添加/讀入容器。 看起來不需要列表重新創建,因為listModel是最新的,它應該通知列表刷新更改,除非searchResults為空。 這只是一個沒有看代碼的猜測。

使用具有過濾支持的單列JTable可能更容易。 有關詳細信息,請參閱排序和篩選

考慮使用支持過濾列表的框架,例如fi SwingX

然后基本步驟是:

  • 實現一個RowFilter,它根據名稱片段過濾聯系人
  • 將DocumentListener安裝到textField
  • 在從文檔更改通知時,在列表上安裝新過濾器

偽代碼片段

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

我有一個快速閱讀,說實話,沒有太多可去的。

我不確定這種方法的結果

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

這對我來說表明沒有可用的聯系人

searchResults = new ContactList();

但那是因為我錯過了背景。

一個更好的解決方案可能是使用“代理”模型,基本上是一個包裝模型的模型,它為您提供過濾器功能,或者正如Max建議的那樣,一個JTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM