[RESOLVIDO] Atualizar última coluna da JTable imediatamente após a edição das anteriores

2 respostas
S

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);
    }
}

2 Respostas

R

No método setValueAt(), eu experimentaria usar fireTableRowsUpdated() em vez de fireTableCellUpdated(). Isso forçaria a atualização da linha inteira, em vez de apenas uma célula.

S

Cara, deu certo…

Muito obrigado!

Criado 9 de janeiro de 2012
Ultima resposta 10 de jan. de 2012
Respostas 2
Participantes 2