Mostrare risultato query al click di una cella JTable

di il
10 risposte

Mostrare risultato query al click di una cella JTable

Non riesco a trovare una soluzione, spero qualcuno possa aiutarmi.
Ho un MainFrame in cui utizzo un CardLayout; per prima viene mostrata la HomeFrame in cui c'è una tabella che visualizza una lista di nomi presi dal database. Quello che devo fare è questo: al click su una cella (contenete un determinato nome) si apre la seconda "card" (SchedaFrame) in cui dovrò mostrare una tabella contenente tutti i dati di quel determinato nome. Ho utilizzato un mouse listener che è questo:

class MousePressListener implements MouseListener
        {
        	public void mouseClicked(MouseEvent e) 
        	{
        		Point point = e.getPoint();
        		int row = names.rowAtPoint(point);
        		int col = names.columnAtPoint(point);
				String selected = names.getValueAt(row, col).toString();
				SchedaFrame c = new SchedaFrame(mainFrame);
				c.showData(selected);
				mainFrame.goSchedaFrame();
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub				
			}
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub				
			}
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub				
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
			}
		}
Nella MainFrame succede questo:

public class MainFrame extends JFrame{
	private Container contentPane = getContentPane();
	private CardLayout cardLayout = new CardLayout();
	
	public MainFrame()
	{	
		setSize(900,700); 
		setLocation(250, 10); 
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE); 
		
		contentPane.setLayout(cardLayout);
		contentPane.add(new HomeFrame(this), "Home");
		contentPane.add(new SchedaFrame(this), "scheda");
	}
	
	public void goHomeFrame() 
	{
		this.setTitle("Home");
		cardLayout.show(contentPane, "Home");
	}
	
	public void goSchedaFrame()
	{
		this.setTitle("Scheda");
		cardLayout.show(contentPane, "scheda");
	}
}
Ed infine la SchedaFrame:

public class SchedaFrame extends JPanel
{
	private JScrollPane scroll;
	private JTable scheda;
	private TableModelCard table; 
	ArrayList<TabellaDB> data = new ArrayList<TabellaDB>();
	
	public SchedaFrame(MainFrame mainFrame) throws HeadlessException
	{	 
		table = new TableModelCard(data);
		scheda = new JTable(table);
		scroll = new JScrollPane(scheda);
		add(scroll, BorderLayout.CENTER);
	}
	
	public void showData(String selected)
	{
		data = TabellaDBDAO.showAll(selected);
	}
}
So bene che sbaglio tutto in SchedaFrame, solo che dovrei passare il valore selezionato al DAO per poter visualizzare tutti i dati che lo riguardano.
Quello che chiedo è, come posso fare a passare questo valore dal mouse listener al SchedaFrame per poterlo visualizzare nella tabella?

10 Risposte

  • Re: Mostrare risultato query al click di una cella JTable

    rossociliegia ha scritto:


    So bene che sbaglio tutto in SchedaFrame, solo che dovrei passare il valore selezionato al DAO per poter visualizzare tutti i dati che lo riguardano.
    Quello che chiedo è, come posso fare a passare questo valore dal mouse listener al SchedaFrame per poterlo visualizzare nella tabella?
    Sì, è sbagliato perché quando fai new TableModelCard(data) nel costruttore, data è una lista "vuota" e il table model quindi si tiene dentro una lista vuota. Dopo, quando invochi showData, vai ad assegnare a data, ma questo NON cambia quello che avevi passato prima a TableModelCard !!

    Se il TableModelCard avesse un metodo es. setData che riceve la lista, potresti fare nel showData:

    data = TabellaDBDAO.showAll(selected);
    table.setData(data);

    Se questo avviene prima che il pannello SchedaFrame sia visibile non dovrebbero esserci problemi. Un setData come quello comunque, in generale, sarebbe meglio se scatenasse i dovuti eventi usando il "fire" del TableModelEvent appropriato. (immagino che TableModelCard estenda AbstractTableModel, quindi puoi usare i vari fireXXX).


    Per il momento, vedi se riesci a risolvere così. Poi però dovrai sicuramente prima o poi affrontare meglio queste questioni perché vedo che vai un po' a tentoni ..
  • Re: Mostrare risultato query al click di una cella JTable

    andbin ha scritto:


    potresti fare nel showData:

    data = TabellaDBDAO.showAll(selected);
    table.setData(data);

    Se questo avviene prima che il pannello SchedaFrame sia visibile non dovrebbero esserci problemi.
    Non va nemmeno così...mostra solo tutto quello che c'è nel costruttore, non se ne frega niente del metodo showData()

    andbin ha scritto:


    Un setData come quello comunque, in generale, sarebbe meglio se scatenasse i dovuti eventi usando il "fire" del TableModelEvent appropriato. (immagino che TableModelCard estenda AbstractTableModel, quindi puoi usare i vari fireXXX).
    Potresti spiegarmi/farmi un esempio/passarmi un link utile? Non so se sono io a non saper cercare, ma non trovo niente di chiaro a riguardo sul web.

    Comunque buona cosa l'esperienza.
  • Re: Mostrare risultato query al click di una cella JTable

    Nessuno riesce ad aiutarmi?
  • Re: Mostrare risultato query al click di una cella JTable

    Per favore, puoi postare di nuovo il codice con le nuove modifiche, ed aggiungere dei commenti per aumentare la velocità di comprensione?

    Errori non ne da?
    Cosa mostra nel costruttore dato che Data è vuoto? cosa significa?
    è possibile che crei un nuovo oggetto quando invece devi riutilizzare quello vecchio o passare il riferimento del nuovo e cancellare il vecchio?
  • Re: Mostrare risultato query al click di una cella JTable

    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).
  • Re: Mostrare risultato query al click di una cella JTable

    MarkRider ha scritto:


    puoi postare di nuovo il codice con le nuove modifiche, ed aggiungere dei commenti per aumentare la velocità di comprensione?

    Ansharja ha scritto:


    Ci aiuteresti molto se riuscissi a creare un esempio completo.
    Certamente, vi posto tutti i file.

    MainFrame : il frame dove uso il CardLayout
    
    public class MainFrame extends JFrame
    {	
    	private Container contentPane = getContentPane();
    	private CardLayout cardLayout = new CardLayout();
    	
    	public MainFrame()
    	{	
    		contentPane.setLayout(cardLayout);
    		contentPane.add(new HomeFrame(this), "home");
    		contentPane.add(new CardDisciplinaFrame(this), "scheda");
    	}
    	
    	public void goHomeFrame() 
    	{
    		this.setTitle("Home");
    		cardLayout.show(contentPane, "home");
    	}
    	
    	public void goCardDisciplina()
    	{
    		this.setTitle("Disciplina selezionata");
    		cardLayout.show(contentPane, "scheda");
    	}
    
    }
    

    HomeFrame : la prima finestra ad essere visualizzata
    
    public class HomeFrame extends JPanel
    {
    	private JTable namesDisciplina; //tabella che conterrà le discipline presenti nel db
    	private JScrollPane scrollPane; //scrollPane che contiene la tabella
    	
    	public HomeFrame(MainFrame mainFrame)
    	{	
    		/* visualizzo le discipline presenti nel db in una JTable */
    		ArrayList<Disciplina> listNamesDiscipline = new ArrayList<Disciplina>();
    		listNamesDiscipline = DisciplinaDAO.showNamesDiscipline(); //il metodo showNamesDiscipline() esegue la query per visualizzare i nomi
    		TableNamesDiscipline table = new TableNamesDiscipline(listNamesDiscipline);
    		namesDisciplina = new JTable(table);
    		scrollPane = new JScrollPane(namesDisciplina);
    		add(scrollPane);
    
    		class MousePressListener implements MouseListener
            	{
            		public void mouseClicked(MouseEvent e)  
            		{
            			Point point = e.getPoint();
            			int row = namesDisciplina.rowAtPoint(point);
            			int col = namesDisciplina.columnAtPoint(point);
    				String disciplinaSelezionata = namesDisciplina.getValueAt(row, col).toString();
    				CardDisciplinaFrame c = new CardDisciplinaFrame(mainFrame);
    				c.showData(disciplinaSelezionata);
    				mainFrame.goCardDisciplina();
    			}
    
    			@Override
    			public void mouseEntered(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mouseExited(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mousePressed(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    		}	
    		
    	    	MouseListener l = new MousePressListener();
    	    	namesDisciplina.addMouseListener(l);
    	 }
    }  
    
    CardDisciplinaFrame : la finestra che dovrebbe aprirsi visualizzando le info della disciplina su cui si clicca
    
    public class CardDisciplinaFrame extends JPanel
    {
    	private JScrollPane scroll;
    	private JTable cardDisciplina;
    	private TableModelCardDisciplina table; 
    	ArrayList<Disciplina> dataDisciplina = new ArrayList<Disciplina>();
    	
    	public CardDisciplinaFrame(MainFrame mainFrame)
    	{
    		table = new TableModelCardDisciplina(dataDisciplina);
    		cardDisciplina = new JTable(table);
    		scroll = new JScrollPane(cardDisciplina);
    		add(scroll, BorderLayout.CENTER);
    	}
    	public void showData(String selected)
    	{
    		dataDisciplina = DisciplinaDAO.showAllDisciplina();
    		table.setDati(dataDisciplina);
    	}
    }
    
    DisciplinaDAO : la classe in cui eseguo le varie query
    
    public class DisciplinaDAO
    {	
    	public static DisciplinaDAO instance;
    	
    	public static synchronized DisciplinaDAO getInstance() 
    	{ 
    		if(instance == null)
    			instance = new DisciplinaDAO();
    		return instance;  
    	}
    	
    	public static ArrayList<Disciplina> showNamesDiscipline()
    	{
    		ArrayList<Disciplina> namesDiscipline = new ArrayList<Disciplina>();
    		ArrayList<String[]> result = DbConnection.getInstance().eseguiQuery("SELECT disciplina.nome FROM disciplina");
    		Iterator<String[]> i = result.iterator();
    		while(i.hasNext())
    		{
    			String[] row = i.next();
    			Disciplina d = new Disciplina();
    			d.setNome(row[0]);
    			namesDiscipline.add(d);
    		}
    		return namesDiscipline;
    	}
    	
    	public static ArrayList<Disciplina> showAllDisciplina(String nomeDisciplina)
    	{
    		
    		ArrayList<Disciplina> data = new ArrayList<Disciplina>();
    		ArrayList<String[]> result = DbConnection.getInstance().eseguiQuery("SELECT disciplina.nome, disciplina.descrizione, disciplina.immagine, disciplina.costo_mensile FROM disciplina WHERE disciplina.nome = '"+nomeDisciplina+"'");
    		Iterator<String[]> i = result.iterator();
    		while(i.hasNext())
    		{
    			String[] row = i.next();
    			Disciplina d = new Disciplina();
    			d.setNome(row[0]);
    			d.setDescrizione(row[1]);
    			d.setPathImg(row[2]);
    			d.setCosto(row[3]);
    			data.add(d);
    		}
    		return data;
    	}
    			
    }
    
    Disciplina : il model della tabella db
    
    public class Disciplina {
    	
    	private int id;
    	private String nome;
    	private String descrizione;
    	private String pathImg;
    	private String costo;
    	
    	public int getId(){
    		return id;
    	} 
    	public void setId(int id){
    		this.id = id;
    	}
    	
    	public String getNome(){
    		return nome;
    	}
    	public void setNome(String nome){
    		this.nome = nome;
    	}
    	
    	public String getPathImg() {
    		return pathImg;
    	}
    	public void setPathImg(String path) {
    		this.pathImg = path;
    	}
    	
    	public String getDescrizione(){
    		return descrizione;
    	}
    	public void setDescrizione(String descrizione){
    		this.descrizione = descrizione;
    	}
    	
    	public String getCosto(){
    		return costo;
    	}
    	public void setCosto(String costo){
    		this.costo = costo;
    	}	
    }
    
    La tabella Disciplina nel db è strutturata così:
    
    CREATE TABLE IF NOT EXISTS disciplina(
    	id INT AUTO_INCREMENT PRIMARY KEY,
        nome VARCHAR(20) NOT NULL,
        descrizione VARCHAR(500) NOT NULL,
        immagine VARCHAR(80) NOT NULL,
        costo_mensile INT NOT NULL
    );
    
    Non so cos'altro possa servire. Dovrebbe essere sufficiente.
    Comunque ho capito che l'errore sta nel richiamare "showData()" dopo aver creato gli oggetti vuoti. La mia domanda è: come fare a passare "disciplinaSelezionata" a "CardDisciplinaFrame" in modo da eseguire la query nel DAO?

    Grazie dell'aiuto.

    p.s. ho dimenticato i due table model, eccoli qui:
    
    public class TableNamesDiscipline extends AbstractTableModel{
    	
    	private static String[] columnNames = { "LE NOSTRE DISCIPLINE" };
    	private ArrayList<Disciplina> namesDiscipline;
    	
    	public ArrayList<Disciplina> getDati()
    	{
    		return namesDiscipline;
    	}
    
    	public TableNamesDiscipline(ArrayList<Disciplina> names) 
    	{
    		super();
    		this.namesDiscipline = names;
    	}
    	
    	public String getColumnName(int column) 
    	{
            return columnNames[column];
        }
    	
    	public int getRowCount() {
    		return namesDiscipline.size();
    	}
    		
    	public Object getValueAt(int row, int column) {
    	        Disciplina d = namesDiscipline.get(row);
    	        return d.getNome();
    	}
    
    	public int getColumnCount() 
    	{
    		return columnNames.length;
    	}
    }
    
    
    public class TableModelCardDisciplina extends AbstractTableModel{
    	
    	private static String[] columnNames = { "nome", "descrizione", "immagine", "costo" };
    	private ArrayList<Disciplina> dataDisciplina;
    	
    	public void setDati(ArrayList<Disciplina> dati)
    	{
    		this.dataDisciplina = dati;
    	}
    	
    	public ArrayList<Disciplina> getDati()
    	{
    		return dataDisciplina;
    	}
    
    	public TableModelCardDisciplina(ArrayList<Disciplina> names) 
    	{
    		super();
    		this.dataDisciplina = names;
    	}
    	
    	public String getColumnName(int column) 
    	{
            return columnNames[column];
        	}
    	
    	public int getRowCount() {
    		return dataDisciplina.size();
    	}
    		
    	public Object getValueAt(int row, int column) {
            Disciplina d = dataDisciplina.get(row);
            switch (column) 
            {
            		case 0: return d.getNome();
                		case 1: return d.getDescrizione();
                		case 2: return d.getPathImg();
               		case 3: return d.getCosto();
            }
    
            return null;
        	}
    
    	public int getColumnCount() 
    	{
    		return columnNames.length;
    	}
    }
    
  • Re: Mostrare risultato query al click di una cella JTable

    A quanto vedo il problema è sempre quello di cui parlava @andbin, il tuo TableModel non viene mai aggiornato dopo la modifica.
    Se vuoi usare quel metodo showData (), puoi provare a chiamare il metodo fireTableDataChanged() sul tuo TableModel (TableModelCardDiscilpina), per notificare alla tabella che c'è stato un cambiamento dei dati.

    Ma visto che il tuo frame CardDisciplinaFrame viene istanziato quando la disciplina è già stata scelta, perché non passi i dati direttamente al costruttore del frame ?
    Potresti richiamare DisciplinaDAO.showAllDisciplina () prima di costruire il frame, e passare come parametro quel ArrayList <Disciplina>.
    Probabilmente esistono design migliori, ma mi pare meglio della soluzione attuale.

    PS: Mi sono ricordato di questa discussione di qualche tempo fa, è lo stesso programma no ?
  • Re: Mostrare risultato query al click di una cella JTable

    Ansharja ha scritto:


    PS: Mi sono ricordato di questa discussione di qualche tempo fa, è lo stesso programma no ?
    Ahah sarà un mio compagno di corso(?), lo sto preparando per un esame dell'Università quindi può essere.

    Comunque proverò quello che mi hai detto, se non dovesse andare vi aggiorno!
  • Re: Mostrare risultato query al click di una cella JTable

    Ansharja ha scritto:


    Ma visto che il tuo frame CardDisciplinaFrame viene istanziato quando la disciplina è già stata scelta, perché non passi i dati direttamente al costruttore del frame ?
    Potresti richiamare DisciplinaDAO.showAllDisciplina () prima di costruire il frame, e passare come parametro quel ArrayList <Disciplina>.
    Probabilmente esistono design migliori, ma mi pare meglio della soluzione attuale.
    Allora, ho provato a fare così: ho creato una classe di "appoggio" dove memorizzerei la variabile che mi serve:
    
    public class VarContainer {
    
        public String variablename;
    
        private static VarContainer instance = null;
    
        public static VarContainer getInstance(){
        if(instance == null){
            instance = new VarContainer();
        }
            return instance;
        }
    
    }
    Quindi nella HomeFrame il mouse listener in questo modo:
    
    MouseListener clickOnTable;
    clickOnTable = new MouseListener()
            {		
            	public void mouseClicked(MouseEvent e)  
            	{
            		
            		Point point = e.getPoint();
            		int row = namesDisciplina.rowAtPoint(point);
            		int col = namesDisciplina.columnAtPoint(point);
            		VarContainer.getInstance().variablename = namesDisciplina.getValueAt(row, col).toString();
    				mainFrame.goCardDisciplina();
    			}
    		/* vari override */
    		};
    		
    		
    	    namesDisciplina.addMouseListener(clickOnTable);
    	    
    e per finire nella CardFrame questo:
    public class CardDisciplinaFrame extends JPanel
    {
    	private JScrollPane scroll;
    	private JTable cardDisciplina;
    	private TableModelCardDisciplina table; 
    	String nomeDisciplina;
    	ArrayList<Disciplina> dati = new ArrayList<Disciplina>();
    	
    	public CardDisciplinaFrame(MainFrame mainFrame)
    	{	
    		dati = DisciplinaDAO.showAllDisciplina(VarContainer.getInstance().variablename);
    		table = new TableModelCardDisciplina(dati);
    		cardDisciplina = new JTable(table);
    		scroll = new JScrollPane(cardDisciplina);
    		add(scroll, BorderLayout.CENTER);
    	}
    }
    
    Ma niente, anche se mi sembra un pò strano. Cosa sbaglio?

    Inoltre ho provato quello che mi hai detto ma non va comunque. Ti posto le modifiche (copio solo i pezzi modificati):
    
    public class HomeFrame
    {
    String disciplinaSelezionata;
    ArrayList<Disciplina> datiDisciplina = new ArrayList<Disciplina>;
    
    public ArrayList<Disciplina> getDati()
    {  return datiDisciplina;   }
    
    public HomeFrame(MainFrame mainFrame)
    {
    
    /* ....... */
    clickOnTable = new MouseListener()
            {		
            	public void mouseClicked(MouseEvent e)  
            	{
            		
            		Point point = e.getPoint();
            		int row = namesDisciplina.rowAtPoint(point);
            		int col = namesDisciplina.columnAtPoint(point);
            		disciplinaSelezionata = namesDisciplina.getValueAt(row, col).toString();
            		datiDisciplina = DisciplinaDAO.showAllDisciplina(disciplinaSelezionata);
    			mainFrame.goCardDisciplina();
    			}
    
    			@Override
    			public void mouseEntered(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mouseExited(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mousePressed(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				// TODO Auto-generated method stub
    				
    			}
    		};
    		
    		
    	    namesDisciplina.addMouseListener(clickOnTable);
    	}	   
    }
    
    E nel CardFrame la richiamo così:
    
    public class CardDisciplinaFrame extends JPanel
    {
    	private JScrollPane scroll;
    	private JTable cardDisciplina;
    	private TableModelCardDisciplina table; 
    	
    	public CardDisciplinaFrame(MainFrame mainFrame)
    	{	
    		table = new TableModelCardDisciplina(HomeFrame.getDati());
    		cardDisciplina = new JTable(table);
    		scroll = new JScrollPane(cardDisciplina);
    		add(scroll, BorderLayout.CENTER);
    	}
    }
    

    Nessuno dei due modi risolve il problema.
  • Re: Mostrare risultato query al click di una cella JTable

    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.
Devi accedere o registrarti per scrivere nel forum
10 risposte