Estou fazendo uma caderneta escolar e tenho uma JTable onde a 2ª coluna recebe o nome dos alunos (a 1ª é o nº deles), as 8 seguintes estão habilitadas a receberem somente P ou F, presença ou falta, e a última está desabilitada à edição, pois atualiza da classe Aluno (para onde vai as informações da tabela) a soma dos F's na tabela.
Até aí está funcionando tudo corretamente. O problema é que a soma na última coluna só atualiza após mudança de linha, ou pelo mouse ou pelo teclado.
Se eu edito uma célula e continuo nela mesmo, ou se mudo de coluna continuando na mesma linha, a última coluna não atualiza, até eu mudar de linha. Somente com a mudança de linha atualiza as faltas do aluno editado.
Queria atualização do nº de faltas imediatamente após a edição das células.
Código:
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
import java.awt.Color;
public class ModelPresenca extends AbstractTableModel
{
private static List<Aluno> alunos;
public ModelPresenca(){
/* recebe a lista de alunos da sala.
* GUI.getSalaAtual() retorna a sala usada no programa atualmente. */
alunos = GUI.getSalaAtual().getListaAlunos();
}
@Override
public int getRowCount() {
return alunos.size();
}
@Override
public int getColumnCount() {
return 11;
}
@Override
public String getColumnName(int column) {
if(column == 0)
return "N";
else if(column == 1)
return "Nome";
else if(column < 10)
return "Aula " + (column - 1);
else
return "Faltas";
}
@Override
public Object getValueAt(int row, int column) {
if(column == 0)
return (row+1);
else if(column == 1)
return alunos.get(row).getNome();
else if(column > 1 && column < 10)
return alunos.get(row).isFaltou(column - 2); // retorna String Aluno.faltas[i] -> "P", "F" ou "";
else
return alunos.get(row).getFaltas(); // retorna o num de faltas
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if(aValue == null)
return ;
String a = aValue.toString();
if(columnIndex == 1)
alunos.get(rowIndex).setNome(a);
if(columnIndex > 1 && columnIndex < 10){
if(a.equalsIgnoreCase("F") || a.equalsIgnoreCase("P") || a.equals(""))
alunos.get(rowIndex).setFaltas(columnIndex - 2, a); // edita String Aluno.faltas[i]
else
Dialogo.erro("Insira somente \"P\" ou \"F\".");
}
fireTableCellUpdated(rowIndex, columnIndex);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex != 0 && columnIndex != 10;
}
/* Adição e exclusão de alunos da List<Aluno> está nos métodos Sala.addAluno() e Sala.excluirAluno()
* Aqui está somente um aviso à tabela de que alguém foi adicionado ou excluído */
public void addAluno(){
fireTableRowsInserted(alunos.size() - 1, alunos.size() - 1);
}
public void excluirAluno(int indice, JTable tabela){
fireTableRowsDeleted(indice, indice);
}
}