[英]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,我在此類中重用它來替換完整的聯系人列表。
任何幫助解決這個問題都會有很大的幫助。 如果我需要發布代碼的其他部分,請告訴我。
考慮使用支持過濾列表的框架,例如fi SwingX
然后基本步驟是:
偽代碼片段
// 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.