Ciao,
l'intero set di classi che compongono il framework Swing segue il pattern MVC (Model-View-Controller) ovvero una specifica tecnica di programmazione che richiede la suddivisione del software in questi tre elementi, al fine di facilitare la suddivisione delle competenze all'interno dell'applicazione.
Tuttavia è altrettanto vero che il pattern MVC non è (specialmente agli inizi) di facile implementazione, sicchè è possibile lavorare senza seguirlo (seppur abbattendo drasticamente le peculiarità che Swing offre); ne è un esempio la classe JTable: è infatti possibile utilizzarla per visualizzare dati contenuti all'interno di strutture come matrici o vettori, ma sicuramente il modo migliore è l'uso dell'interfaccia TableModel (MVC).
Tale interfaccia definisce i metodi che è necessario implementare per consentire alla tabella di recuperare le informazioni necessarie a run-time; in alternativa (scelta da preferirsi) puoi utlizzare la classe AbstractTableModel, che semplicemente offre un'implementazione minimale della predetta interfaccia, lasciandoti la necessità di ridefinire i seguenti metodi:
- getColumnName
- getColumnCount
- getRowCount
- getValueAt
Credo che nessuna spiegazione sia più chiarificatrice di un esempio:
import java.util.*;
import javax.swing.table.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class Persona {
private String cognome,nome;
Persona( String cognome, String nome )
{
this.cognome = cognome;
this.nome = nome;
}
public String getCognome()
{
return cognome;
}
public String getNome()
{
return nome;
}
}
class Persone extends AbstractTableModel {
private Vector elenco = new Vector();
Persone()
{
super();
}
void add( String cognome, String nome )
{
elenco.add( new Persona( cognome,nome ) );
}
public String getColumnName(int column)
{
if( column==0 ) {
return "Cognome";
} else {
return "Nome";
}
}
public int getColumnCount()
{
return 2;
}
public int getRowCount()
{
return elenco.size();
}
public Object getValueAt(int row, int column)
{
Persona p = (Persona)elenco.get(row);
if( column==0 ) {
return p.getCognome();
} else {
return p.getNome();
}
}
}
class elencoPersone extends JFrame {
Persone tm = new Persone();
JTextField txtNome = new JTextField(5);
JTextField txtCognome = new JTextField(5);
elencoPersone()
{
super( "Elenco amici" );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize( 500,300 );
setResizable( false );
tm.add( "Alighieri","Dante" );
tm.add( "Petrarca","Francesco" );
JPanel pnl = new JPanel();
pnl.setLayout( new BorderLayout() );
pnl.add( new JScrollPane( new JTable( tm ) ) , BorderLayout.CENTER );
JPanel pnlAggiunta = new JPanel();
pnlAggiunta.add( new JLabel( "Cognome" ) );
pnlAggiunta.add( txtCognome );
pnlAggiunta.add( new JLabel( "Nome" ) );
pnlAggiunta.add( txtNome );
JButton btn = new JButton( "Aggiungi" );
btn.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
tm.add( txtCognome.getText() , txtNome.getText() );
tm.fireTableDataChanged();
}
}
);
pnlAggiunta .add( btn );
pnl.add( pnlAggiunta , BorderLayout.SOUTH );
setContentPane( pnl );
show();
}
public static void main( String arg[] )
{
new elencoPersone();
}
}
In questo esempio ci sono 3 classi distinte:
- Persona (ovvio!);
- Persone (che estende AbstractTableModel e gestisce le modifiche alla struttra dati, il vettore elenco);
- elencoPersone (che visualizza il modello Persone);
I blocchi di codice in rosso sono quelli di maggior importanza, su di essi dovrai meditare... ![Hmm [^o)]](/emoticons/emotion-40.gif)
Spero che ti possa essere d'aiuto per la crescita nel linguaggio Java, nonchè spunto per approfondire l'argomento MVC. ![Wink [;)]](/emoticons/emotion-5.gif)
Ciao ciao