CHECKBOX em JTable só retorna FALSE

1 resposta
R

Tenho uma JTable com model de Abstract Table e está funcionando perfeitamente, nela tenho algumas colunas e eu populo essa tabela com dados vindo do bd, cada linha tem um checkbox, permitindo que o usuário selecione quantas linhas quiser, e quando vou pegar as linhas que estão selecionadas sempre retorna false, estando marcado ou não. Estou usando getValueAt(0, 0) para receber o valor do checkbox, já tentei também utilizar o getSelectedRows() mas não funcionou também...

abstract table:

public class CorreioTableModel extends AbstractTableModel 
{
    private static final int SELECIONADO = 0;
    private static final int TRANSPORTADORA = 1;
    private static final int BASE = 2;
    private static final int CONTRATO = 3;
    private static final int LOTE = 4;
    private static final int NF = 5;
    private static final int VALOR = 6;
    private static final int NUMPROVISAO = 7;
    private static final int VALORPROVISAO = 8;
    
    private List<Correio> linhas;
    private String[] colunas = new String[] {"", "Transportadora", "Base", "Contrato", "Lote", "NF", "Valor", "Nº Provisão", "Valor Provisão" };
    
    public CorreioTableModel() 
    {
        linhas = new ArrayList<Correio>();
    }
    
    public CorreioTableModel(List<Correio> tabelaCorreio) 
    {
        linhas = new ArrayList<Correio>(tabelaCorreio);
    }
    
    @Override
    public int getRowCount() 
    {        
        return linhas.size();
    }
    
    @Override
    public int getColumnCount() 
    {
        return colunas.length;
    }
    
    @Override
    public String getColumnName(int columnIndex) 
    {
        return colunas[columnIndex];
    };
    
    @Override
    public Class<?> getColumnClass(int columnIndex) 
    {
        switch (columnIndex) 
        {
            case SELECIONADO:
                return Boolean.class;
            case TRANSPORTADORA:
                return String.class;
            case BASE:
                return String.class;
            case CONTRATO:
                return String.class;
            case LOTE:
                return String.class;
            case NF:
                return int.class;
            case VALOR:
                return BigDecimal.class;
            case NUMPROVISAO:
                return int.class;
            case VALORPROVISAO:
                return BigDecimal.class;
            default:
            // Não deve ocorrer, pois só existem 9 colunas
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) 
    {
        // apenas o campo "SELECIONADO" será editável           
        return (columnIndex == SELECIONADO);
    }             
    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) 
    {
        // Pega referente a linha especificada.
        Correio correio = linhas.get(rowIndex);
        switch (columnIndex) 
        {
            case SELECIONADO:                
                return correio.isSelecionado();                
            case TRANSPORTADORA:
                return correio.getTransportadora();
            case BASE:
                return correio.getBase();
            case CONTRATO:
                return correio.getContrato();
            case LOTE:
                return correio.getLote();
            case NF:
                return correio.getNF();
            case VALOR:
                return correio.getValor();
            case NUMPROVISAO:
                return correio.getNumProvisao(); 
            case VALORPROVISAO:
                return correio.getValorProvisao();                 
            default:
            // Não deve ocorrer, pois só existem 9 colunas
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }                
    
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) 
    {
        // Pega referente a linha especificada.
        Correio correio = linhas.get(rowIndex);
        switch (columnIndex) 
        {
            case SELECIONADO:
                correio.setSelecionado((Boolean) aValue);                
                break;
            case TRANSPORTADORA:
                correio.setTransportadora((String) aValue);
                break;
            case BASE:
                correio.setBase((String) aValue);
                break;
            case CONTRATO:
                correio.setContrato((String) aValue);
                break;
            case LOTE:
                correio.setLote((String) aValue);
                break;
            case NF:
                correio.setNF((int) aValue);
                break;
            case VALOR:
                correio.setValor((BigDecimal) aValue);
                break;
            case NUMPROVISAO:
                correio.setNumProvisao((int) aValue);
                break;
            case VALORPROVISAO:
                correio.setValorProvisao((BigDecimal) aValue);
                break;
            default:
            // Não deve ocorrer, pois só existem 9 colunas
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula        
    }
    
    // Retorna referente a linha especificada
    public Correio getLinhas(int indiceLinha) 
    {
        return linhas.get(indiceLinha);
    }  
}

Populando a tabela:

private List<Correio> criaTabela() throws Throwable 
    {
        List<Correio> tabela = new ArrayList<Correio>();                
        
        dao.Conector con = new Conector();
        Statement st = con.conectar().createStatement();                                
        
        String sql="";//AQUI É O MEU SELECT DO BD
        ResultSet rs = st.executeQuery(sql);
        
        while(rs.next())
        {
            Correio linha = new Correio();
            linha.setSelecionado(false);
            linha.setTransportadora(rs.getString("Transportadora"));
            linha.setBase(rs.getString("Base"));
            linha.setContrato(rs.getString("Contrato"));
            linha.setLote(rs.getString("Lote"));
            linha.setNF(rs.getInt("NF"));
            linha.setValor(rs.getBigDecimal("valorNF"));
            linha.setNumProvisao(rs.getInt("Num_Provisao"));
            linha.setValorProvisao(rs.getBigDecimal("Valor_Provisao"));
            tabela.add(linha);
        }            
        return tabela;
    }

Para testar o valor que retorna do checkbox estou fazendo:

System.out.println(tblNFs.getValueAt(0,0));

o checkbox marcado retorna false e desmarcado também, alguem sabe onde está o erro?.

1 Resposta

U

Rps nesta página há uma implementação de check box em uma tabela

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

Criado 16 de setembro de 2014
Ultima resposta 28 de set. de 2014
Respostas 1
Participantes 2