Ciao ragazzi, dopo due giorni quasi ininterrotti per cercare di fare un filtraggio di elementi di una JTable mi ritrovo qui a chiedere il vostro aiuto per chiarirmi dei dubbi e magari per ricevere qualche aiuto.

Vi descrivo brevemente il mio programma.
Si tratta di un gestore mp3 che permette di gestire brani musicali e i relativi tag.

Ma veniamo al punto.

Tralasciando parti del programma inutili al problema, ho due pannelli. Il primo contiene una JTable sulla quale sono listati gli mp3 importati dall'utente ordinati (in tabella) per "#", "Titolo", "Artista", "Album", "Numero traccia (nell'album)", "Genere", "Anno" e Percorso.
Nell'altro pannello ho i componenti per applicare il filtro/ricerca.
I componenti (principali, tralascio inutili JLabel) sono i seguenti:
-una JComboBox grazie alla quale si può scegliere il tipo di filtraggio/ricerca. Le scelte possibili sono "Anno", "Genere", "Artista", "Album".
-un JTextField nel quale l'utente può (deve) inserire il testo su cui si baserà la ricerca/filtraggio.
-un JButton con il quale il filtraggio/ricerca verrà fatto partire.

Il tutto è strutturato nel seguente modo:
Alla JComboBox è associato un ascoltatore che a seconda della scelta crea un nuovo ascoltatore per il JButton al quale passa: la colonna su cui effettuare la ricerca, il JTextField sul quale l'utente scrive il testo per filtrare la tabella, la JTable in questione, il modello della tabella, e un sorter precedentemente creato.

Bene. Tutto funziona MA:
1)Il filtraggio rimane impostato sul primo tipo di filtraggio effettuato. Vi faccio un esempio per capirci meglio:
Seleziono dalla JComboBox il tipo di filtraggio per "Artista", scrivo il testo nel JTextField, clicco il JButton e tutto funziona. Ora però seleziono dalla JComboBox un filtraggio per "Album" (l'ascoltatore rileva il cambiamento) ma la ricerca rimane sempre settata su Artista e continua quindi a filtrare la tabella per Artista.

2)Se io seleziono un elemento dalla tabella, il filtraggio non avviene e viene lanciata una eccezione di ArrayOutOfBound (o qualcosa del genere) e più o meno tutto impazzisce. Ho provato a usare miatabella.clearSelection(); ma viene anche qui lanciata una eccezione forse dovuta al fatto che ho anche un altro ascoltatore che mi preleva la riga selezionata.

Vi posto un po di codice tralasciando quello che non c'entra nulla con il problema.
(Nel caso notaste dei passaggi di parametri che poi non vengono usati, lo so, è solo che dopo numerose modifiche mi rompeva rifinire il tutto)

Codice dell'ascoltatore della JComboBox
codice:
public class AscoltatoreComboRicerca implements ActionListener{
	
	private JLabel jl2;
	private JComboBox jcb;
	private JTextField jtf;
	private TableRowSorter<TableModel> sorter;
	private String input_ricerca;
	private JButton jb;
	private JTable jt;
	private MioModelloTabella mmt;
	
	
	
	
	
	public AscoltatoreComboRicerca(JTextField jtf, TableRowSorter<TableModel> sorter, JLabel jl2, JComboBox jcb, JButton jb, JTable jt, MioModelloTabella mmt){
		this.jl2 = jl2;
		this.jcb = jcb;
		this.jtf = jtf;
		this.sorter = sorter;
		this.jb = jb;
		this.jt = jt;
		this.mmt = mmt;
		
		
	   
	}

	public void actionPerformed(ActionEvent e) {
	
		//jt.getSelectionModel().clearSelection();
		//jt.clearSelection();
		jb.setEnabled(true);
		jcb = (JComboBox)e.getSource();
		String tipo_ricerca = (String)jcb.getSelectedItem();
		System.out.println("!!!!!!!!DENTRO ALL'ASCOLTATORECOMBORICERCA, PER LA JCOMBOBOX, IL TIPO_RICERCA è: " + tipo_ricerca);
		if (tipo_ricerca == "") {
			jl2.setText("Scegli tipo di ricerca");
			jtf.setEditable(false);
			
			
			
		}
		else {
			jl2.setText("Inserisci " + tipo_ricerca + " : ");
			jtf.setEditable(true);
			
		}
		
		if (tipo_ricerca == "Artista"){
			
			//Setto l'ascoltatore dedicato per il bottone.
		    AscoltatoreBottoni ab = new AscoltatoreBottoni(2, jtf, jt, mmt, sorter );
			jb.addActionListener(ab);
			
			
			
		}
		
		if (tipo_ricerca == "Album"){
			 AscoltatoreBottoni ab = new AscoltatoreBottoni(3, jtf,jt, mmt, sorter);
			 jb.addActionListener(ab);
			
			
			
		}
		
		if (tipo_ricerca == "Genere"){
			AscoltatoreBottoni ab = new AscoltatoreBottoni(5, jtf, jt, mmt, sorter);
			jb.addActionListener(ab);
			
			
			
		}
		
		if (tipo_ricerca == "Anno"){
			AscoltatoreBottoni ab = new AscoltatoreBottoni(6, jtf, jt, mmt, sorter );
			jb.addActionListener(ab);
			
			
		}
		
	}
	
}
Ascoltatore dei vari bottoni del programma, tra cui di quello che lancia la ricerca.

codice:
public class AscoltatoreBottoni implements ActionListener{
	
	private ArrayList<Mp3> lista_mp3;
	private MioModelloTabella mmt, mmt2;
	int col;
	private JTextField jtf;
	private JTable jt;
	private TableRowSorter<TableModel> sorter;
	
	[....Primo costruttore inutile da farvi vedere...]
	

/**
	 * Secondo costruttore per il tasto cerca/filtra del pannello a sud della tabella.
	 * @param col Colonna implicata nella ricerca/sorting.
	 * @param jt Tabella su cui verrà applicato la ricerca/sorting.
	 * @param mmt Modello della tabella che mi serve per applicare il filtro.
	 */
	public AscoltatoreBottoni(int col, JTextField jtf, JTable jt, MioModelloTabella mmt, TableRowSorter<TableModel> sorter){
		this.col = col;
		this.jtf = jtf;
		this.mmt = mmt;
		this.jt = jt;
		this.sorter = sorter;
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		
        [.....Eventi inutili da farvi vedere perché si riferiscono ad altri bottoni]
		
		if((e.getActionCommand()=="Cerca/Filtra") || (e.getActionCommand() == "Azzera ricerca/filtro")){
			
			 	//jt.getSelectionModel().clearSelection();
			 	//jt.clearSelection();
			  	//Per resettare la situazione.
			   if (col == 0) { 
			    RowFilter<Object, Object> filter = new RowFilter <Object, Object>() {
			     
			     public boolean include(Entry entry) {
			     Integer tmp = (Integer) entry.getValue(col); //a seconda della scelta dell'utente qui ci va il numero della colonna.
			      
			       return tmp.intValue() >0;
			       
			     }};
			     try {
			     TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(mmt);

				   jt.setRowSorter(sorter);
				  
				    sorter.setRowFilter(filter);
			     } catch (NullPointerException a){
			    	 
			    	 System.out.println("ERRORE IN ASCOLTATORE BOTTONI");
			     }

		}
			   
			   else {
				    
				    //Prendo la stringa dal jtf.
				   	String ricerca = jtf.getText();
			        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(mmt);
			        sorter.setRowFilter(RowFilter.regexFilter(ricerca, col));  							//Cerca le righe che rispondono al campo ricerca.
			        //sorter.setSortKeys(null);
			        jt.setRowSorter(sorter);
			       
				  

				  }
			
		}
	}
A voi l'ardua sentenza.

Grazie!