JTable: deletando linha

1 resposta
Vini_Fernandes

Minha duvida eh a seguinte: tenho um JTable cuja primeira coluna eh um tipo boolean e mais outras duas colunas do tipo String. Seleciono uma linha “checando” a caixinha da primeira coluna, até aqui tudo bem, mas quando eu tento deletar a linha que “chequei” as coisas nao funcionam e a linha que some eh sempre a ultima linha da tabela. Resumindo, o que desejo fazer eh algo semelhante a uma caixa de email, onde escolho quais as mensagens serao deletadas. O que estou usando pra remoção da linha eh:

Collection<Integer> lista = ((MyModel)caixaDeMensagemView.getTabelaMensagem().getModel()).getValuesFromColumn(0);
        Collection<Mensagem> listaDeMensagensParaDeletar = new ArrayList<Mensagem>();
        for (Integer i : lista) {
            Logger.getLogger(CaixaDeMensagemNavegacao.class).info(" removendo a mensagem: "+listaDeMensagens.get(i)+" na linha: "+i);
            
            ((MyModel)caixaDeMensagemView.getTabelaMensagem().getModel()).removeRow(i);
        }

onde tenho

class MyModel extends DefaultTableModel  {
         private Object[][] data = {};
         private Object[] columnName = {};

         public MyModel(Object [][] data, Object[] columnName) {
             super(data, columnName);
             this.data = data;
             this.columnName = columnName;
         }
         public Object getValueAt(int row, int col) {
               return data[row][col];
         }

         public boolean isCellEditable(int row, int col) {
               if (col == 0) return true;
               return false;
         }

         public Class getColumnClass(int column) {
               Class klass = String.class;
               if (column == 0) klass = Boolean.class;
               return klass;
         }

         public String getColumnName(int col){
            return (String)columnName[col];
         }

         public Collection<Integer> getValuesFromColumn(int col){
            //escolhemos a colecao LinkedList pois devemos manter a ordem da inclusao da lista
            Collection<Integer> lista = new LinkedList<Integer>();

            for(int k =0; k < data.length; k++){
                if(data[k][col] != null && (Boolean)data[k][col]){
                    lista.add(k);
                    
                }
            }
            return lista;
         }
          public void setValueAt(Object value, int row, int col) {
               if (col == 0 ){
                   data[row][col] = (Boolean)value;
               }

         }

   }
 
}

Agradeco a ajuda que aparecer!!

1 Resposta

R

Em vez de percorrer em ordem crescente a lista de itens a remover, percorra-a em ordem decrescente para ter certeza de que está excluindo os itens corretos. Explicando: digamos que você queira remover os itens 0, 2 e 7. Ao remover o item 0, aquele que era o item 2 antes do laço de exclusão passa a ser o item 1, e portanto quando você remover o item 2, terá excluído o elemento errado. Ao percorrer a lista em ordem decrescente, esse problema desaparece.

Criado 14 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 1
Participantes 2