rts*_*ker 2 java swing keylistener jlist
我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
编辑**包含所有原始联系人的原始ListModel在此匿名类之前声明,并被称为listModel,我在此类中重用它来替换完整的联系人列表.
任何帮助解决这个问题都会有很大的帮助.如果我需要发布代码的其他部分,请告诉我.
没有剩下的代码就很难看到逻辑.考虑发布SSCCE.看起来你正在重新创建JList关键监听器事件:
contacts = new JList(listModel);
Run Code Online (Sandbox Code Playgroud)
需要将新列表添加/读取到容器中.看起来像最新的列表重新创建listModel并且它应该通知列表刷新更改,除非searchResults是空的.这只是一个没有看代码的猜测.
使用JTable具有过滤支持的单个列可能更容易.有关详细信息,请参阅排序和筛选.
考虑使用支持过滤列表的框架,例如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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6365 次 |
| 最近记录: |