Esempio completo:

codice:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class SearchableListTestFrame extends JFrame {
    private static final String[] parole = {
        "gatta", "gattabuia", "gattaia", "gattaiola", "gattamorta",
        "gatteggiamento", "gatteggiare", "gattesco", "gattice",
        "gattinara", "gattino", "gatto", "gattofilo", "gattomammone",
        "gattonare", "gattoni", "gattopardesco", "gattopardismo",
        "gattopardo", "gattuccio",  "gauchesco", "gauchisme",
        "gauchismo", "gauchista", "gaucho", "gaudente", "gaudere",
        "gaudio", "gaufré", "gaullismo", "gaullista", "gauss",
        "gavaina", "gavazzamento", "gavazzare", "gavazzatore",
        "gavetta", "gavettino", "gavettone", "gaviale", "gavigliano",
        "gavigne", "gavillare", "gavina", "gavitello", "gavocciolo",
        "gavone", "gavotta", "gay", "gazare", "gazatrice", "gazatura",
        "gazebo", "gazella", "gazofilacio", "gazometro", "gazoso",
        "gazza", "gazzarra", "gazzella", "gazzetta", "gazzettiere",
        "gazzettino", "gazzettistico", "gazzosa",
    };

    private JTextField textField;
    private SearchableListModel listModel;
    private JList list;
    private JScrollPane scrollPane;

    public SearchableListTestFrame() {
        super("Searchable List Test");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);

        Container contentPane = getContentPane();

        listModel = new SearchableListModel(parole);

        textField = new JTextField();
        list = new JList(listModel);
        scrollPane = new JScrollPane(list);

        contentPane.add(textField, BorderLayout.NORTH);
        contentPane.add(scrollPane, BorderLayout.CENTER);

        textField.getDocument().addDocumentListener(new DocumentListener() {
            public void changedUpdate(DocumentEvent e) { search(); }
            public void insertUpdate(DocumentEvent e) { search(); }
            public void removeUpdate(DocumentEvent e) { search(); }
        });
    }

    private void search() {
        listModel.search(textField.getText());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                SearchableListTestFrame f = new SearchableListTestFrame();
                f.setVisible(true);
            }
        });
    }
}


class SearchableListModel extends AbstractListModel {
    private String[] strings;
    private ArrayList<String> resultList;

    public SearchableListModel(String[] strings) {
        this.strings = strings;
        resultList = new ArrayList<String>();
        search("");  // search fittizio per setup iniziale
    }

    public Object getElementAt(int index) {
        return resultList.get(index);
    }

    public int getSize() {
        return resultList.size();
    }

    // Metodo custom per eseguire la ricerca
    // e modificare il model
    public void search(String searchString) {
        resultList.clear();

        for (int i = 0; i < strings.length; i++) {
            // Verifica solo la parte iniziale
            // (è possibile fare qualunque altro tipo di "filtro")
            if (strings[i].startsWith(searchString)) {
                resultList.add(strings[i]);
            }
        }

        // IMPORTANTE!!! Serve a notificare come minimo la
        // "view" di JList
        fireContentsChanged(this, 0, resultList.size() - 1);
    }
}
Alcune note:
- Notare i metodi del DocumentListener che invocano un metodo privato che semplicemente prende il testo del text field e lo passa al metodo search() del model.
- Notare i commenti nel SearchableListModel
- Le parole sono prese da un dizionario online ... perchè ho iniziato da "gatta" potete immaginarlo.