3

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 と呼ばれます。

これを解決する助けがあれば、大いに役立ちます。コードの他の部分を投稿する必要がある場合はお知らせください。

4

3 に答える 3

5

残りのコードがないとロジックを確認するのは困難です。SSCCEの投稿を検討してください。JListキーリスナーイベントでを再作成しているようです。

contacts = new JList(listModel);

その新しいリストをコンテナに追加/再読み込みする必要があります。リストの再作成は最新の状態では必要ないようです。空listModelでない限り、変更を更新するようにリストに通知する必要があります。searchResultsこれは、コードを見ないでの単なる推測です。

JTableフィルタリングをサポートする単一の列を使用する方が簡単な場合があります。詳細については、並べ替えとフィルタリングを参照してください。

于 2012-08-16T03:15:16.963 に答える
5

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); 
于 2012-08-16T08:36:29.383 に答える
3

私はざっと読んだだけで、正直なところ、それほど多くはありません。

この方法の結果がよくわからない

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

そして、これは私にとって利用可能な連絡先がないことを示唆しています

searchResults = new ContactList();

しかし、それは私が文脈を欠いているからです。

より良い解決策は、「プロキシ」モデルを使用することです。これは、基本的にはモデルをラップするモデルであり、フィルター機能を提供するか、Max が提案したように、JTable

于 2012-08-16T03:18:43.757 に答える