Mostrare ArrayList con una query in un jPanel

di il
8 risposte

Mostrare ArrayList con una query in un jPanel

Salve, sono nuova e sono anche abbastanza inesperta su java, e chiedo perdono se sbaglio qualcosa nel postare.
Sono alle prese con un progetto per un esame all'università, ovvero una applicazione che gestisca il database di un centro sportivo.
Ho la classe TesseratoDAO in cui ho costruito questo metodo per mostrare tutti i tesserati presenti nel db:
public static ArrayList<Tesserato> showAllTesserati() 
	{
		ArrayList<Tesserato> tesserati = new ArrayList<Tesserato>();
		ArrayList<String[]> result = DbConnection.getInstance().executeQuery("SELECT * FROM tesserato");
		Iterator<String[]> i = result.iterator();
		while(i.hasNext())
		{
				String[] row = i.next();
				Tesserato t = new Tesserato();
				t.setMatricola(row[0]);
				t.setNome(row[1]);
				t.setCognome(row[2]);
				t.setDataNascita(row[3]);
				t.setIndirizzo(row[4]);
				t.setCitta(row[5]);
				t.setRecapito(row[6]);
				tesserati.add(t);
		}
		if(tesserati.isEmpty() == true) { System.out.println("Non ci sono tesserati iscritti."); }
		return tesserati;
	}
Ora, dovrei mostrare il risultato della query in una finestra, che ho chiamato HomeFrame, per farlo ho scritto questo:
package progetto.centroSportivo.view;

import java.awt.*;
import java.io.File;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;

import progetto.centroSportivo.view.Table;
import progetto.centroSportivo.model.Tesserato;
import progetto.centroSportivo.dao.*;

public class HomeFrame extends JFrame{
	
	private JPanel northPanel = new JPanel();
	private JTextField emailtxt;
	private JPasswordField passwordtxt;
	private JButton loginButton;
	private JButton signupButton;
	private JTable listTable;
	private JPanel listPnl;
	//private JTable listaDiscipline;
	
	
	public HomeFrame(String title) throws HeadlessException
	{	
		super(title);

		setSize(600,600);
		setLocation(400, 50);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		loginButton = new JButton("Accedi");
		signupButton = new JButton("Registrati");
		northPanel.setLayout(new FlowLayout());
		
		northPanel.add(new JLabel("E-mail: "));
		emailtxt = new JTextField(10);
		northPanel.add(emailtxt);
		northPanel.add(new JLabel("Password: "));
		passwordtxt = new JPasswordField(10);
		northPanel.add(passwordtxt);
		northPanel.add(loginButton);
		northPanel.add(signupButton);		
		getContentPane().add(northPanel, BorderLayout.NORTH);

		ArrayList<Tesserato> listTesserati = new ArrayList<Tesserato>();
		listTesserati = TesseratoDAO.showAllTesserati();
		Table t = new Table(listTesserati);
		listTable = new JTable(t);
		listPnl = new JPanel();
		listPnl.add(listTable);
		getContentPane().add(listPnl);
		
	}
}
Infine richiamo HomeFrame nella classe Launcher.java, il problema è che mostra solo il la parte in cui ci sono i due bottoni e le label, ma non mostra il risultato della query.
Qualcuno saprebbe indicarmi quali errori sto commettendo? Ed eventualmente aiutarmi?
Vi ringrazio in anticipo

8 Risposte

  • Re: Mostrare ArrayList con una query in un jPanel

    rossociliegia ha scritto:


    Ho la classe TesseratoDAO in cui ho costruito questo metodo per mostrare tutti i tesserati presenti nel db:
    Guarda, su questo "nì" ... sì e no. Per funzionare .. funziona sicuramente, ma sarebbe altamente migliorabile. Poi capisco ovviamente i limiti di conoscenza e/o di tempo.

    rossociliegia ha scritto:


    Infine richiamo HomeFrame nella classe Launcher.java, il problema è che mostra solo il la parte in cui ci sono i due bottoni e le label, ma non mostra il risultato della query.
    Qualcuno saprebbe indicarmi quali errori sto commettendo? Ed eventualmente aiutarmi?
    In teoria la tabella dovrebbe farla vedere, cioè "qualcosa" dovresti comunque vederlo. Non è però quello il modo appropriato di disporre il JTable. Generalmente/tipicamente JTable si mette come "view" in un JScrollPane (così la tabella è "scrollabile") e il JScrollPane lo si inserisce in un certo contenitore in modo da avere o una dimensione prefissata a priori oppure che possa occupare tutto uno spazio disponibile (es. in CENTER di un BorderLayout).

    Così come hai disposto tu il JTable, è direttamente in un JPanel, che ha un FlowLayout che rispetta il "preferred size" dei componenti (di JTable in questo caso). E inoltre non avendo usato JScrollPane il "header" della tabella NON lo vedi.

    Il dubbio a questo punto ricade su quel

    Table t = new Table(listTesserati);

    Cosa fa e come è fatto Table? (che è sicuramente un "table model")
  • Re: Mostrare ArrayList con una query in un jPanel

    il dubbio a questo punto ricade su quel

    Table t = new Table(listTesserati);

    Cosa fa e come è fatto Table? (che è sicuramente un "table model")
    Ho cercato di attuare una cosa del genere fatta dal professore, comunque hai ragione avrei dovuto scrivere anche il codice di quella, sarebbe fatta così:
    
    package progetto.centroSportivo.view;
    import progetto.centroSportivo.model.Tesserato;
    import java.util.*;
    import javax.swing.table.AbstractTableModel;
    
    public class Table extends AbstractTableModel{
    
       private ArrayList<Tesserato> dati;
       
       public ArrayList<Tesserato> getDati()
       {
            return dati;
       }
       
       public Table(ArrayList<Tesserato> dati)
       {
           super();
           this.dati = dati;
        }
        
    }
    
  • Re: Mostrare ArrayList con una query in un jPanel

    rossociliegia ha scritto:


    Ho cercato di attuare una cosa del genere fatta dal professore, comunque hai ragione avrei dovuto scrivere anche il codice di quella, sarebbe fatta così:
    La Table che hai scritto è sì un "table model" (poiché estende AbstractTableModel) ma fatta così NON serve a niente. Non hai implementato praticamente nulla di quello che invece servirebbe!

    Quando si estende AbstractTableModel (che è molto tipico per table model "custom"), AbstractTableModel mette a disposizione già fatto tutto il meccanismo di (de/)registrazione e notifica dei listener ma tutto il resto è a carico tuo.

    Il table model ha bisogno di uno "storage" dei dati, quello devi implementarlo tu. Devi inoltre "esporre" dati e informazioni tramite i vari getColumnName, getColumnClass, isCellEditable, getValueAt, ecc... Anche questo è a carico tuo.

    Conclusione: dovresti affrontare meglio l'argomento dei table model .... altrimenti non ne esci.

    P.S. puoi vedere i miei (vecchissimi) esempi su JTable qui

    P.S.2: quel tuo
    private ArrayList<Tesserato> dati;

    E' effettivamente lo "storage" dei dati. Ma come detto, manca tutto il resto.
  • Re: Mostrare ArrayList con una query in un jPanel

    Grazie mille, allora credo che dovrò approfondire meglio, ma ci sarebbe un altro modo per mostrare l'ArrayList contenente il risultato della query? Comunque avevo provato varie cose ma non riesco a far visualizzare nulla di nulla
  • Re: Mostrare ArrayList con una query in un jPanel

    rossociliegia ha scritto:


    allora credo che dovrò approfondire meglio
    Sì, cerca di comprendere il senso e la filosofia dei table model. Se hai dubbi a riguardo, chiedi pure.

    rossociliegia ha scritto:


    ma ci sarebbe un altro modo per mostrare l'ArrayList contenente il risultato della query?
    L'ideale è appunto una tabella JTable. Alternative sì, sono possibili. Ad esempio una "griglia" di componenti che crei per visualizzare i dati. Ma è molto meno bello (graficamente, intendo), più difficile da gestire e implica altre questioni.
  • Re: Mostrare ArrayList con una query in un jPanel

    Questo è il table model modificato:
    
    package progetto.centroSportivo.view;
    
    import java.util.ArrayList;
    import javax.swing.table.AbstractTableModel;
    
    import progetto.centroSportivo.model.*;
    
    public class TableTesserati extends AbstractTableModel{
    	
    	private ArrayList<Tesserato> datiTesserato;
    	
    	public ArrayList<Tesserato> getDati()
    	{
    		return datiTesserato;
    	}
    
    	public TableTesserati(ArrayList<Tesserato> dati) 
    	{
    		super();
    		this.datiTesserato = dati;
    	}
    
    	public int getRowCount() {
    		return datiTesserato.size();
    	}
    	
    	public boolean isCellEditable(int row, int column) 
    	{
    	        return false;
    	}
    	
    	public Object getValueAt(int row, int column) {
    	        Tesserato Tesserato = datiTesserato.get(row);
    
    	        switch (column) {
    	            case 0: return Tesserato.getMatricola();
    	            case 1: return Tesserato.getNome();
    	            case 2: return Tesserato.getCognome();
    	            case 3: return Tesserato.getDataNascita();
    	            case 4: return Tesserato.getIndirizzo();
    	            case 5: return Tesserato.getCitta();
    	            case 6: return Tesserato.getRecapito();
    	            case 7: return Tesserato.getEmail();
    	            case 8: return Tesserato.getPassword();
    	        }
    
    	        return null;
    	    }
    
    	@Override
    	public int getColumnCount() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    }
    Questa è la parte di codice che ho scritto in HomeFrame:
    
    //variabili utilizzate
    private TableTesserati tableModel;
    private JTable table;
    private JScrollPane scrollPane;
    
    /*il resto è rimasto invariato*/
    
    	ArrayList<Tesserato> listTesserati = new ArrayList<Tesserato>();
    	listTesserati = TesseratoDAO.showAllTesserati();
            tableModel = new TableTesserati(listTesserati);
            table = new JTable(tableModel);
            scrollPane = new JScrollPane(table);
            getContentPane().add(scrollPane);
    
    Ricordo il metodo che dovrebbe eseguire la query:
    public static ArrayList<Tesserato> showAllTesserati() 
    	{
    		ArrayList<Tesserato> tesserati = new ArrayList<Tesserato>();
    		ArrayList<String[]> result = DbConnection.getInstance().eseguiQuery("SELECT * FROM tesserato");
    		Iterator<String[]> i = result.iterator();
    		while(i.hasNext())
    		{
    				String[] row = i.next();
    				Tesserato t = new Tesserato();
    				t.setMatricola(row[0]);
    				t.setNome(row[1]);
    				t.setCognome(row[2]);
    				t.setDataNascita(row[3]);
    				t.setIndirizzo(row[4]);
    				t.setCitta(row[5]);
    				t.setRecapito(row[6]);
    				t.setEmail(row[7]);
    				t.setPassword(row[8]);
    				tesserati.add(t);
    		}
    		if(tesserati.isEmpty() == true) { System.out.println("Non ci sono tesserati iscritti."); }
    		return tesserati;
    	}
    Ora compare un una quadrato nella finestra, ma sempre vuoto, non mostra il risultato della query.
  • Re: Mostrare ArrayList con una query in un jPanel

    rossociliegia ha scritto:


    Questo è il table model modificato:
    - getRowCount OK
    - isCellEditable OK (nota: in AbstractTableModel c'è già il isCellEditable con return false; "fisso", generalmente lo si ridefinisce solo se devi fare diversamente)
    - getValueAt OK (nota: non mettere una variabile con lo stesso nome del tipo ... è fuorviante)
    - getColumnCount .. NO! C'è un return di 0 e questo vuol dire che non "vedi" colonne! Il numero delle colonne non lo puoi dedurre da un qualche oggetto ... lo devi "sapere" tu a priori per come sai di aver implementato il table model. Nel getValueAt tratti 9 colonne e quindi questo numero dovrai "esporre" dal getColumnCount

    E' abbastanza tipico tenere un array dei nomi delle colonne (che esponi ciascuna dal getColumnName) e quindi il numero di colonne lo puoi dedurre dalla lunghezza dell'array.

    Manca il String getColumnName(int column) che ti permette di personalizzare le intestazioni.

    In AbstractTableModel il getColumnClass ritorna fisso Object.class. Questo va bene in generale, nel senso che ciò che vedrai nelle celle è il risultato del toString() su ciascun oggetto che getValueAt restituisce. E visto che in Tesserato hai tutte stringhe, questo è sufficiente.
  • Re: Mostrare ArrayList con una query in un jPanel

    Perfetto, è andato!! Grazie grazie grazie!
Devi accedere o registrarti per scrivere nel forum
8 risposte