Allora, ho provato il tuo codice e penso di aver capito l'errore originario.
Prima di tutto però, quando dicevo:
Ansharja ha scritto:
Ci aiuteresti molto se riuscissi a creare un esempio completo, direttamente compilabile ed eseguibile, che riesca a mostrare il problema.
Per farlo più corto potresti togliere tutto ciò che non è collegato al problema, e soprattutto inserire direttamente nel codice i dati che prendi dal database (anche una parte minima).
Mi riferivo proprio al fatto di avere già tutto pronto (magari un singolo file con tutte le classi), senza dover aggiungere gli import, scrivere il metodo main, inventarsi una classe DbConnection etc, sennò uno perde diversi minuti se non mezz'ora ad aggiungere tutto e farlo funzionare!
Non so gli altri ma io trovo molto più velocemente ciò che non va se posso far partire il programma e toccare con mano il problema (soprattutto se si ha a che fare con un problema relativo a un'interfaccia grafica).
Tanto per farti un esempio io mi sono scritto questa classe idiota per farlo funzionare:
class DbConnection
{
private static DbConnection instance;
private DbConnection () { }
public static DbConnection getInstance () {
if (instance == null) instance = new DbConnection ();
return instance;
}
public ArrayList <String []> eseguiQuery (String query) {
ArrayList <String []> result = new ArrayList <String []> ();
if (query.startsWith ("SELECT disciplina.nome, disciplina.descrizione")) {
result.add (new String [] {"Atletica", "Sport nato nell'antichita'", "C:/atletica.png", "Tantissimo"});
}
else if (query.startsWith ("SELECT disciplina.nome FROM disciplina")) {
result.add (new String [] {"Atletica"});
result.add (new String [] {"Calcio"});
result.add (new String [] {"Tennis"});
result.add (new String [] {"Pallavolo"});
}
else return null;
return result;
}
}
Ovviamente è scritta
da fare pena, ma è tanto per avere due dati in croce da vedere nella tabella per poter testare il programma.
Quindi per la prossima volta se puoi farlo tu ci risparmi tempo e fatica
Ora riguardo al codice che avevi postato inizialmente:
String disciplinaSelezionata = namesDisciplina.getValueAt(row, col).toString();
CardDisciplinaFrame c = new CardDisciplinaFrame(mainFrame);
c.showData(disciplinaSelezionata);
mainFrame.goCardDisciplina();
Mi ero concentrato sul fatto, già sottolineato da @andbin, che il TableModel non venisse aggiornato, ma il problema "principe" è un altro: ovvero il fatto che quel CardDisciplinaFrame c (a proposito, se hai classi che sono pannelli, nomi come CardDisciplinaPanel sarebbero più appropriati) viene creato e mai aggiunto al frame principale, quindi il tuo MainFrame continua ad avere nel CardLayout quel CardDisciplinaFrame aggiunto all'inizio, che non viene mai toccato dalla modifica, ed inizialmente mostra una tabella senza alcun dato.
Dovresti quindi scrivere un metodo in MainFrame che aggiorni direttamente il pannello aggiunto al contentPane (ad esempio potresti tenere il CardDisciplinaFrame come variabile d'istanza della classe), sempre che tu non voglia cambiare design, visto che forse il CardLayout in questo contesto non è la soluzione più adatta (una volta cliccato sulla tabella ed "entrato" in una disciplina, dovresti comunque fornire un modo per tornare indietro, magari sarebbe meglio aprire una dialog modale che mostra nel dettaglio la disciplina e poi viene richiusa), anche se lavorandoci un po' può comunque funzionare bene.
Riguardo alle modifiche che hai fatto dopo: la classe VarContainer mi pare molto forzata, non serve avere una classe solo per passare una variabile.
La soluzione che ti consigliavo era di cercare prima i dati che servono alla tabella con la query, e passarli poi al costruttore di CardDisciplinaFrame per creare subito la tabella già popolata, senza doverla aggiornare in seguito, ma questa soluzione presupporrebbe che tu creassi un nuovo pannello ogni volta (in una dialog, o sostituendolo al CardDisciplinaFrame originario, anche se quest'ultima non mi pare una grande idea), se vuoi continuare ad usare lo stesso pannello sei costretta ad aggiornare il TableModel (del CardDisciplinaFrame iniziale!) in modo opportuno.