Sì, penso di aver capito come funziona....e ho implementato così la classe del tableModel che ha un metodo di ricerca:

codice:
  class SimpleTableModel extends AbstractTableModel{
      //Intestazione delle colonne
      String[] columnNames = {"Nome", "Telefono"};
      private ArrayList<Contact> contatti;
      private ArrayList<Contact> resultContatti;

        public SimpleTableModel(ArrayList<Contact> contatti) {
            this.contatti = contatti;
            resultContatti = new ArrayList<Contact>();
            search2("");  // search fittizio per setup iniziale
        }

        //Numero di righe uguale alla dimensione dell'ArrayList
        public int getRowCount() {
            return contatti.size();
        }

        //Numero di colonne
        public int getColumnCount() {
            return columnNames.length;
        }

        //Ritorno il contenuto di una cella
        public Object getValueAt(int row, int col) {
           //Seleziona il contatto
            Contact c = contatti.get(row);
            switch (col){
                case 0: return c.getName();
                case 1: return c.getTel();
            }
            return null;
        }

        // ritorna il nome della colonna
        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        // Metodo custom per eseguire la ricerca
        public void search2(String searchString) {
            resultContatti.clear();
            if(searchString.equals("")){
                for(int i = 0; i < contatti.size() ; i++){
                    resultContatti.add(contatti.get(i));
                }
                fireTableDataChanged();
            }
            else{
                for (int i = 0; i < contatti.size(); i++) {
                    if (contatti.get(i).getName().toLowerCase().contains(searchString.toLowerCase())) {
                            resultContatti.add(contatti.get(i));
                    }
                   fireTableDataChanged();
                }
            }
        }

}
E ho gestito gli eventi sulla textfield dove viene inserita la parola o le lettere da cercare.
Gli eventi sono ascoltati...ma la tableModel non viene aggiornata...forse sbaglio il fireTableDataChanged()?