Credo sia il caso di fare un esempio completo di implementazione di un table model, visto che non mi sembra di averne mai postato uno ... almeno non così completo.
codice:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class ElencoPersoneFrame extends JFrame {
private PersonaTableModel tableModel;
private JTable table;
private JScrollPane scrollPane;
private JButton aggiungiButton;
public ElencoPersoneFrame() {
super ("Elenco Persone");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize(450, 350);
ArrayList<Persona> listaPersone = new ArrayList<Persona>();
listaPersone.add(new Persona("Mario", "Rossi", 1972, false));
listaPersone.add(new Persona("Giacomo", "Bianchi", 1946, false));
listaPersone.add(new Persona("Roberto", "Verdi", 1985, true));
tableModel = new PersonaTableModel(listaPersone);
table = new JTable(tableModel);
scrollPane = new JScrollPane(table);
aggiungiButton = new JButton("Aggiungi");
aggiungiButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Crea una persona predefinita ... giusto per esempio
// L'ideale sarebbe presentare una dialog per l'input di una persona
Persona p = new Persona("Gianni", "Neri", 1983, false);
// Modifica direttamente il table model
tableModel.aggiungiPersona(p);
}
});
getContentPane().add(scrollPane, BorderLayout.CENTER);
getContentPane().add(aggiungiButton, BorderLayout.SOUTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ElencoPersoneFrame f = new ElencoPersoneFrame();
f.setVisible(true);
}
});
}
}
class Persona {
private String nome;
private String cognome;
private int annoNascita;
private boolean disoccupato;
public Persona(String nome, String cognome, int annoNascita, boolean disoccupato) {
this.nome = nome;
this.cognome = cognome;
this.annoNascita = annoNascita;
this.disoccupato = disoccupato;
}
public String getNome() { return nome; }
public String getCognome() { return cognome; }
public int getAnnoNascita() { return annoNascita; }
public boolean isDisoccupato() { return disoccupato; }
public void setNome(String nome) { this.nome = nome; }
public void setCognome(String cognome) { this.cognome = cognome; }
public void setAnnoNascita(int annoNascita) { this.annoNascita = annoNascita; }
public void setDisoccupato(boolean disoccupato) { this.disoccupato = disoccupato; }
}
class PersonaTableModel extends AbstractTableModel {
private ArrayList<Persona> listaPersone;
public PersonaTableModel(ArrayList<Persona> listaPersone) {
this.listaPersone = listaPersone;
}
public int getRowCount() {
return listaPersone.size();
}
public int getColumnCount() {
return 4;
}
public String getColumnName(int column) {
switch (column) {
case 0: return "Nome";
case 1: return "Cognome";
case 2: return "Anno nascita";
case 3: return "Disoccupato?";
}
return "";
}
public Class getColumnClass(int column) {
switch (column) {
case 0: return String.class;
case 1: return String.class;
case 2: return Number.class; // il renderer/editor di default per Number allinea a destra
case 3: return Boolean.class; // il renderer/editor di default per Boolean mostra un "checkbox"
}
return Object.class;
}
public boolean isCellEditable(int row, int column) {
return column == 3; // solo la colonna 3 è editabile!
}
public Object getValueAt(int row, int column) {
Persona p = listaPersone.get(row);
switch (column) {
case 0: return p.getNome();
case 1: return p.getCognome();
case 2: return p.getAnnoNascita(); // auto-boxing!
case 3: return p.isDisoccupato(); // auto-boxing!
}
return null;
}
public void setValueAt(Object value, int row, int column) {
Persona p = listaPersone.get(row);
switch (column) {
case 0: p.setNome((String) value); break;
case 1: p.setCognome((String) value); break;
case 2: p.setAnnoNascita((Integer) value); break; // unboxing!
case 3: p.setDisoccupato((Boolean) value); break; // unboxing!
}
}
// Metodo "custom", non inerente a TableModel/AbstractTableModel
public void aggiungiPersona(Persona p) {
listaPersone.add(p);
int row = listaPersone.size() - 1;
// IMPORTANTE, notifica l'aggiunta di una riga nel model
fireTableRowsInserted(row, row);
}
}