Di default una tabella che ha un DefaultTableModel come modello è editabile, devi aver fatto qualcosa tu per disattivare questa caratteristica (se stai usando quello come da titolo, la superclasse AbstractTableModel invece di default non consente di modificare le celle), in genere lo si fa con l'override del metodo di DefaultTableModel, facendo sempre un return false all'interno ...
Comunque se vuoi rendere la tabella editabile o meno a runtime è sufficiente usare proprio questo metodo: puoi creare una classe che estende DefaultTableModel (o anche AbstractTableModel, ma devi ridefinire molti più metodi) e fare l'override di isCellEditable, ritornando il valore di una variabile booleana memorizzata all'interno della classe.
Ti basta quindi inserire un metodo setter per modificare il valore di questa variabile dall'esterno per fare quello che vuoi a runtime.
Posto sotto un codice di esempio con un checkbox che rende il modello editabile/non editabile. In questo scenario il valore vale per l'intera tabella. Se vuoi avere alcune celle editabili e altre no la cosa è abbastanza più complicata.
Nota che potresti anche rendere la tabella non editable utilizzando semplicemente
table.setEnabled (false), ma è una cosa diversa, ti impedisce anche di selezionare le righe della tabella e per alcuni look and feel (forse) potrebbe anche cambiarne l'aspetto.
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class ToggleEditableModel
{
public static void main (String [] a) {
SwingUtilities.invokeLater (new Runnable () {
@Override public void run () {
createAndShowGUI ();
}
});
}
private static void createAndShowGUI () {
JFrame frame = new JFrame ("Toggle Editable Model");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setContentPane (new MainPanel ());
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
}
class MainPanel extends JPanel
{
public MainPanel () {
super (new BorderLayout ());
// Table Data
Object [][] data = {
{ "Kathy", "Smith" },
{ "John", "Doe" },
{ "Sue", "Black" },
{ "Jane", "White" },
{ "Joe", "Brown" }
};
String [] columnNames = { "First Name", "Last Name", "# of Years", "Vegetarian" };
// Table Model and table
ToggleModel model = new ToggleModel (data, columnNames);
JTable table = new JTable (model);
add (new JScrollPane (table), BorderLayout.CENTER);
// Checkbox
JCheckBox checkBox = new JCheckBox ("Editable Model", true);
checkBox.addItemListener (new ItemListener () {
@Override public void itemStateChanged (ItemEvent e) {
model.setEditable (e.getStateChange () == ItemEvent.SELECTED);
}
});
add (checkBox, BorderLayout.SOUTH);
}
class ToggleModel extends DefaultTableModel
{
private boolean editable;
public ToggleModel (Object [][] data, String [] columnNames) {
super (data, columnNames);
this.editable = true;
}
@Override public boolean isCellEditable (int row, int column) {
return editable;
}
public void setEditable (boolean editable) {
this.editable = editable;
}
}
}