JTable com checkBox [RESOLVIDO]

5 respostas
F

Olá galera!
Fiz um modelo para a minha JTable, onde no primeiro campo aparece um checkBox, mas eu não consigo marca-lo!
O que está faltando?
Código:

public class ProdutoTableModel extends AbstractTableModel {
    
    private final int COL_CHECK = 0;
    private final int COL_NOME = 1;
    private final int COL_QUANT = 2;
    
    private List<Produto> produtos;

    public ProdutoTableModel() {
        produtos = new ArrayList<Produto>();
    }

    public ProdutoTableModel(List<Produto> lista) {
        this();
        produtos.addAll(lista);
    }

    public int getRowCount() {        
        return produtos.size();
    }

    public int getColumnCount() {        
        return 3;
    }

    @Override
    public String getColumnName(int column) {        
        if (column == COL_CHECK){
            return "#";
        }
        if (column == COL_NOME) {
            return "Nome";
        } else if (column == COL_QUANT) {
            return "Quant. Disp";
        }
        return "";
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {  
        if (columnIndex == COL_CHECK){
            return Boolean.class;
        }
        if (columnIndex == COL_NOME) {
            return String.class;
        } else if (columnIndex == COL_QUANT) {
            return Integer.class;
        }
        return super.getColumnClass(columnIndex);
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Produto p = produtos.get(rowIndex);

        if (columnIndex == COL_CHECK){
            return new Boolean(false);
        }
        if (columnIndex == COL_NOME) {
            return p.getNome();
        } else if (columnIndex == COL_QUANT) {
            return p.getQuant();
        }
        return "";
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return (columnIndex == COL_CHECK);
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Produto p = produtos.get(rowIndex);

        if (columnIndex == COL_CHECK){
            new Boolean(true);
        }
        if (columnIndex == COL_NOME) {
            p.setNome(aValue.toString());
        } else if (columnIndex == COL_QUANT) {
            p.setQuant(Integer.parseInt(aValue.toString()));
        }

        fireTableDataChanged();
    }

Agradeço a ajuda!

5 Respostas

E
Teria que setar o valor do campo boolean do seu produto.
@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Produto p = produtos.get(rowIndex);

        if (columnIndex == COL_CHECK){
            p.setCampoBoolean((Boolean) aValue);
        }
Outra coisa é que seu getValueAt está sempre retornando false. A JTable exibe os dados a partir do getValueAt, então se retornar sempre false, o checkBox ficará sempre desmarcado.
F
Eric Yuzo:
Teria que setar o valor do campo boolean do seu produto.
@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Produto p = produtos.get(rowIndex);

        if (columnIndex == COL_CHECK){
            p.setCampoBoolean((Boolean) aValue);
        }
Outra coisa é que seu getValueAt está sempre retornando false. A JTable exibe os dados a partir do getValueAt, então se retornar sempre false, o checkBox ficará sempre desmarcado.
Na verdade o produto não tem um campo boolean, eu apenas necessito que na JTable tenha um campo para que eu possa marcar várias linhas e posteriormente inserir os produtos marcados em uma List Quanto ao getValueAt eu apenas coloquei True como valor inicial, gostaria de saber como eu posso marcá-lo! Valeu!
E

Na verdade deveria existir um campo que guarde o estado, não tem como fazer diretamente no getValueAt e setValueAt, estes métodos servem apenas para setar e recuperar valor de um atributo, como fazem os getters e setters normalmente.

O TableModel deveria trabalhar com uma única classe. Talvez você possa criar uma classe "ProdutoAdicionado", por exemplo, e nele guardar a referência de um produto e permitir a seleção ou não.
public class ProdutoAdicionado {

    private Produto produto; // faz referência ao produto, para ser usado no table model.
    
    private boolean selecionado; // este campo definirá o comportamento do check box da tabela.
    . . .
}
M
if (columnIndex == COL_CHECK){

return new Boolean(false);

}

Retornando sempre false, ele nunca será marcado.

O setValueAt pode até ser chamado, mas com esse return false vai ficar sempre não selecionado.

F
Eric Yuzo:
Na verdade deveria existir um campo que guarde o estado, não tem como fazer diretamente no getValueAt e setValueAt, estes métodos servem apenas para setar e recuperar valor de um atributo, como fazem os getters e setters normalmente. O TableModel deveria trabalhar com uma única classe. Talvez você possa criar uma classe "ProdutoAdicionado", por exemplo, e nele guardar a referência de um produto e permitir a seleção ou não.
public class ProdutoAdicionado {

    private Produto produto; // faz referência ao produto, para ser usado no table model.
    
    private boolean selecionado; // este campo definirá o comportamento do check box da tabela.
    . . .
}
Fiz como vc me falou! Criei um atributo do tipo Boolean. e lá no método setValueAt, onde o Mark se referia, ficou assim:
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Produto p = produtos.get(rowIndex);

        if (columnIndex == COL_CHECK){
            p.setSelecionado((Boolean) aValue);//Aqui
        }
        if (columnIndex == COL_NOME) {
            p.setNome(aValue.toString());
        } else if (columnIndex == COL_QUANT) {
            p.setQuant(Integer.parseInt(aValue.toString()));
        }

        fireTableDataChanged();
    }
Então... tudo resolvido! Agradeço a todos pela ajuda!
Criado 19 de janeiro de 2011
Ultima resposta 20 de jan. de 2011
Respostas 5
Participantes 3