Não utilize DefaultTableModel!
Implemente seu próprio TableModel estendendo AbstractTableModel, aí basta implementar a lógica de habilitar/desabilitar sobrescrevendo o método isCellEditable.
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.AbstractTableModel;
@SuppressWarnings("serial")
public class ExemploTableModel extends JFrame {
/**
* Modelo hipotético para fornecer dados para a JTable
*/
private class MeuTableModel extends AbstractTableModel {
/**
* A JTable chama esse método para saber quantas colunas ela possui
*/
@Override
public int getColumnCount() {
// minha JTable terá 3 colunas
// poderia ter tantas quanto eu quisesse
return 3;
}
/**
* A JTable chama esse método para saber qual é o nome da coluna informada
*/
@Override
public String getColumnName(int col) {
// o nome das colunas será "coluna 0", "coluna 1" e "coluna 2"
// mas poderia ser algo mais óbvio como "Nome", "Idade" e "Gênero" por exemplo
return "Coluna " + col;
}
/**
* A JTable chama esse método para saber quantos itens ela possui
*/
@Override
public int getRowCount() {
// minha JTable terá 10 mil linhas
// mas poderia por exemplo retornar o tamanho da lista de objetos que quero
// renderizar
return 10000;
}
/**
* A JTable chama esse método para saber qual o valor que ela deve apresentar na
* célula informada
*/
@Override
public Object getValueAt(int lin, int col) {
// cada célula da minha JTable vai renderizar sua linha e sua coluna
// mas poderia fazer o seguinte:
// pegar o objeto na posição "lin" da lista
// um switch da coluna e com isso
// devolver o valor dos atributos "nome", "idade" e "genero"
return "célula (" + lin + ", " + col + ")";
}
/**
* A JTable chama esse método para saber se a célula informada é editável ou não
*/
@Override
public boolean isCellEditable(int lin, int col) {
/*
* Aqui você verifica a condição para habilitar ou desabilitar a edição da célula
*
* return true se pode editar
*
* return false se não pode editar
*/
}
}
/**
* Ponto de entrada do exemplo
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
JFrame janela = new ExemploTableModel();
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setSize(640, 480);
janela.setLocationRelativeTo(null);
janela.setVisible(true);
} catch (Throwable t) {
t.printStackTrace();
}
}
// a JTable
private JTable minhaJTable;
// modelo da minha JTable
private MeuTableModel meuTableModel;
private ExemploTableModel() {
super("Exemplo");
meuTableModel = new MeuTableModel();
minhaJTable = new JTable(meuTableModel);
JScrollPane scroll = new JScrollPane(minhaJTable);
Container panel = getContentPane();
panel.add(BorderLayout.CENTER, scroll);
}
}