JCheckBox na JTable [RESOLVIDO]

3 respostas
caiofabioa

Ola pessoal, tenho uma JTable com a model assim:

public class MembroTableModel extends AbstractTableModel {

    List<Membro> linhas;

    private String[] colunas = new String[] {"Nome","Ativo","Idade","Estado Civil","Sexo","Cargo"};

    public MembroTableModel(){
        linhas = new ArrayList<Membro>();
    }

    @Override
    public int getRowCount() {
        return linhas.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Membro m = linhas.get(rowIndex);
        Boolean ativo = m.isAtivo();
        switch(columnIndex){
        case 0:
            return m.getDadosPessoa().getNomeCompleto();
        case 1:
            return ativo;
        case 2:
            return DateUtil.getIdade(m.getDadosPessoa().getDataNascimento());
        case 3:
            return m.getDadosPessoa().getEstadoCivil();
        case 4:
            return m.getDadosPessoa().getSexo();
        case 5:
            return m.getMembresia().getCargoOrigem();
        }
        return null;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
         // Pega o sócio referente a linha especificada.
        Membro membro = linhas.get(rowIndex);

        switch (columnIndex) {
        case 1:
                membro.getDadosPessoa().setNomeCompleto((String)aValue);
        case 2:
                membro.setAtivo((Boolean)aValue);
        case 3:
                membro.getDadosPessoa().setEstadoCivil((String)aValue);
        case 4:
                membro.getDadosPessoa().setSexo((Sexo)aValue);
        case 5:
                membro.getMembresia().setCargoOrigem((String)aValue);
        }

        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula
    };

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch(columnIndex){
        case 1:
            return String.class;
        case 2:
            return Boolean.class;
        case 3:
            return String.class;
        case 4:
            return String.class;
        case 5:
            return String.class;
        default:
            return String.class;
        }
    };

    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }

    public void limpar(){
        linhas.clear();
        fireTableDataChanged();
    }

    public boolean isEmpty() {
        return linhas.isEmpty();
    }

    public void addListMembros(List<Membro> membro) {
        // Pega o tamanho antigo da tabela.
        int tamanhoAntigo = getRowCount();

        // Adiciona os registros.
        linhas.addAll(membro);

        // Reporta a mudança. O JTable recebe a notificação
        // e se redesenha permitindo que visualizemos a atualização.
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
    }

    public Membro getMembroSelected(int rowIndex){
        return linhas.get(rowIndex);
    }

}
A minha classe membro é:
@Entity
public class Membro implements IAtivo{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer idMembro;

    @Lob
    private byte[] foto;

    @Column
    private boolean ativo;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idPessoaFisica")
    private PessoaFisica dadosPessoa;

    @Column(length=50)
    private String nomePai;

    @Column(length=50)
    private String nomeMae;

    @OneToOne
    private Cidade cidadeNascimento;

    @Temporal(TemporalType.DATE)
    private Date dataCasamento;

    @Column
    private String conjuge;

    @Column(length=2)
    private Integer qtdeFilhos;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idMembroHistorico")
    private MembroHistorico membresia;

    // GETTERS AND SETTERS

}

No banco está como Ativo = 1 porem o hibernate transforma para true no objeto como pode ver na imagem:

/////////////////////// CORREÇÃO

Fiz uma classe enum para as colunas assim como o Vinigodoy recomendou e agora esta funcionando corretamente.

3 Respostas

ViniGodoy

Posta os getters e setters e a interface IAtivo.

caiofabioa

@Override public Object getValueAt(int rowIndex, int columnIndex) { Membro m = linhas.get(rowIndex); Boolean ativo = m.isAtivo(); switch(columnIndex){ case 0: return m.getDadosPessoa().getNomeCompleto(); case 1: return ativo; case 2: return DateUtil.getIdade(m.getDadosPessoa().getDataNascimento()); case 3: return m.getDadosPessoa().getEstadoCivil(); case 4: return m.getDadosPessoa().getSexo(); case 5: return m.getMembresia().getCargoOrigem(); } return null; }

Esta diferente de quando pega as classes para as colunas

@Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex){ case 1: return String.class; case 2: return Boolean.class; case 3: return String.class; case 4: return String.class; case 5: return String.class; default: return String.class; } };

Após horas analisando e debugando encontrei o erro amador hehe. Obrigado!!!

ViniGodoy

Por essas e outras é sempre recomendável criar constantes para os índices de colunas.
Ou, melhor ainda, é implementar as colunas na forma de um enum.

Criado 30 de dezembro de 2013
Ultima resposta 31 de dez. de 2013
Respostas 3
Participantes 2