Procuro fazer uma tabela onde, após a edição de uma célula e o clique em algum outro ponto (quando a célula deixar de estar em edição) seja disparada uma ação imediatamente (por exemplo, um JOptionPane.showMessageDialog).
Acho que não fui o suficientemente claro. Preciso tratar uma tabela, e não um JTextField. Se eu tentar adaptar a sua sugestão ao meu problema, o que vou obter uma mensagem quando a tabela perde o foco, no entanto, preciso de uma mensagem (na verdade, não é exatamente uma mensagem que quero, quero outro tipo de ação, mas usei a mensagem como exemplo pra pescar o princípio de como fazer a coisa) que seja disparada quando uma célula perde o foco, e não a tabela toda. Um exemplo disso é eu mudar de célula dentro da própria tabela. A tabela ainda está em foco, mas é a célula que está realmente “focada”.
Nesse caso faça como o Silva Fernandes lhe explicou e depois coloque esse JTextField como cell editor da tabela.
Por outro lado a class JTable possui um método chamado editingStopped (forma geral :void editingStopped(ChangeEvent e)) que performa acções assim que uma célula acabe de ser editada, tente usá-lo.
O link que você colocou serviu de partida para resolver meu problema, o código completo da TableModel ficou:
//Gerando um modelo para a tabela
private DefaultTableModel model = new DefaultTableModel(
new Object [][] {
{"A[1,2]", null},
{"A[3,1]", null},
{"A[2,1]", null},
{"A[3,3]", null}
},
new String [] {
"Endereço", "Elemento"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, true
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
//aqui está o código para gerar a ação logo após a edição da célula
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
//atualiza o que foi editado na própria tabela
super.setValueAt(aValue, rowIndex, columnIndex);
if ( (String)aValue != "" ) {
//converte o que foi digitado de Object para Integer
int valor = Integer.valueOf( (String)aValue );
//pega o elemento da matriz na primeira coluna da tabela
String indiceMatriz = (String)tblElementosMatriz.getValueAt(rowIndex, columnIndex-1);
int linhaMatriz = Integer.valueOf( indiceMatriz.substring(2,3) );
int colunaMatriz = Integer.valueOf( indiceMatriz.substring(4,5) );
//Aqui vai o código para avaliar o que foi editado
if ( valor != matrizIdentificacao[linhaMatriz-1][colunaMatriz-1] ) {
JOptionPane.showMessageDialog( tblElementosMatriz, "Olhe para a matriz ao lado e verifique se o que você digitou está correto", "Observe", 1);
}
} else {
JOptionPane.showMessageDialog( tblElementosMatriz, "É necessário digitar um valor numérico", "Aviso", 0);
}
/*//Para ajudar a entender a lógica dessa parte do programa
System.out.println("Valor digitado na tabela: " + valor);
System.out.println("Indice da linha da matriz mostrada na tabela: " + linhaMatriz);
System.out.println("Indice da coluna da matriz mostrada na tabela: " + colunaMatriz);
System.out.println("Valor armazenado na linha x coluna da matriz, de acordo com a tabela: " + matrizIdentificacao[linhaMatriz-1][colunaMatriz-1]);
System.out.println();
*/
}
};