CheckBox com JtableModel [RESOLVIDO]

Fala galera, possui uma tabela que um dos campos será checkbox, realizarei uma consulta e os dados apareceram e os campos que possui o checkbox, desmarcados, gostaria que quando a pessoa clica-se em determinando campo , bem onde possui o checkbox ele fica-se marcado, pois as linhas com o checkbox marcados, serão considerados depois que podera ser excluido…

Alguem tem ideia de como eu posso implementar isso?

Att

Ahhh e tambem em baixo da tabela possui um outro checkbox, que se caso ele for selecionado, todos os da tabela, serão tbm selecionados, para que o usuario nao prescise ficar um por um…

Obrigado

public class ListaRemoverCarregamentoTModel extends AbstractTableModel {
    
    ArrayList lista = new  ArrayList();
    
    Controlar_RemoverCarregamento ctlremov;
    
    public  ListaRemoverCarregamentoTModel() {
        ctlremov = new Controlar_RemoverCarregamento();
        RemoverCarregamento carreg = new RemoverCarregamento();
        for (int i = 0;i<1;i++) {
            lista.add(carreg);
        }    
        
    }
    public  ListaRemoverCarregamentoTModel(String id) {
        ctlremov = new Controlar_RemoverCarregamento();
        //lista = cadprod.carregarListaProdCoresCad(id);
        CorDsv cor = new CorDsv();
        for (int i=lista.size();i<6;i++) {
            lista.add(cor);
        }
    }
    public  ListaRemoverCarregamentoTModel(ArrayList lista_) {
        ArrayList ls = new ArrayList();
        RemoverCarregamento carreg = new RemoverCarregamento();
        if (!lista_.isEmpty()) {
            for (int i = 0;i<lista_.size();i++) {
                carreg = (RemoverCarregamento) lista_.get(i);
                if (carreg.getStatus() != null) {
                    ls.add(lista_.get(i));
                }
            }
        }
        lista = ls;
        carreg = new RemoverCarregamento();
        for (int i=lista.size();i<6;i++) {
            lista.add(carreg);
        }
    }
    
    @Override
    public String getColumnName(int column) {
        
        String rs = "";
        switch (column) {
            case 0:
                rs = "Plano Carga";
                break;
            case 1:
                rs = "Pedido";
                break;
            case 2:
                rs = "Cliente";
                break;
            case 3:
                rs = "Item";
                break;
            case 4:
                rs = "Qtd.Solic";
                break;
            case 5:
                rs = "Qtd.Atendida";
                break;
            case 6:
                rs = "Status";
                break;
            default:
                rs = "";            
        }
        return rs;
    }
    
    @Override
    public Class getColumnClass(int columnIndex) {
        Class rs;
        switch (columnIndex) {
            case 0:
                rs = Integer.class;
                break;
            case 1:
                rs = Integer.class;
                break;
            case 2:
                rs = Integer.class;
                break;
            case 3:
                rs = String.class;
                break;
            case 4:
                rs = Float.class;
                break;
            case 5:
                rs = Float.class;
                break;
            case 6:
                rs = Boolean.class;
                break;
            default:
                rs = null;            
        }
        return rs;
    }
    
    @Override
    public int getRowCount() {
        return lista.size();
    }

    @Override
    public int getColumnCount() {
        return 7;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        RemoverCarregamento carreg = (RemoverCarregamento) lista.get(rowIndex);
        Object rs= "";
        switch (columnIndex) {
            case 0:
                rs = carreg.getPlano_carga();
                break;
            case 1:
                rs = carreg.getNum_pedido();
                break;
            case 2:
                rs = carreg.getCod_cliente();
                break;
            case 3:
                rs = carreg.getCod_item();
                break;
            case 4:
                rs = carreg.getQtd_solicitada();
                break;
            case 5:
                rs = carreg.getQtd_atendida();
                break;
            case 6:
                String temp = carreg.getStatus();
                if (temp != null) {
                    if (temp.equals("A")) {
                        rs = "true";
                    } else if (temp.equals("I")) {
                        rs = "false";
                    }
                } else {
                    rs = "true";
                }
                break;
            default:
                rs = "";            
        }
        if (columnIndex == 6)
            return Boolean.parseBoolean(rs.toString());
        else
            return rs;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        boolean[] canEdit = new boolean [] {false,false,false,false,false,false,true};
        return canEdit [columnIndex];
    }
    
    public float getCodigo(int rowIndex) {
        CorDsv cor = (CorDsv) lista.get(rowIndex);
        return cor.getCod_cor();
    }
    public void limpaLista() {
        int i = lista.size();
        lista.clear();
        fireTableRowsDeleted(0, i - 1);
    }
    public void remove(int indice) {
        lista.remove(indice);
        fireTableRowsDeleted(indice, indice);
    }
    
}

Segue meu código…

Se sua coluna 6 é um Boolean.class, você deveria estar retornando Boolean.TRUE e Boolean.FALSE ao invés das String "True"e “False”. O mesmo vale para as colunas 4 e 5, onde você veria retornar floats e não Strings.

Para que os checkboxes venham marcados, os objetos cliente devem ser inicializados de modo que já tenham o status “A”.

Boa tarde, Vini…

Então como eu disse, eu queria que ao clicar se estive como true, ele alterace para false, assim desmarcando ele, quando eu realizar a pesquisa eles viram desmarcados, eu so vou marcar eles caso eu queira excluir esses registro do banco… e depois eu queria que ao clicar em um outro checkbox que eu fiz que ele seleciona-se todos os que tem dentro da tabela, para nao prescisar excluir um por um, entendeu?

Obrigado

Como fazer para que ao clicar, ele mude de selecionado para não selecionado e vice versa?

Assim como o Vini disse, voce precisa retornar um boolean go getValue invés de String para o campo que voce quer que seja um checkbox.

Bom dia galera, então eu modifiquei o meu getValue para retornar um Boolean… So que agora eu marco um o outro desmarca, sendo que nao e isso que eu quero. segue a imagem do que estou falando…


Eu consigo selecionar, mas dai a hora que eu seleciono um e tento selecionar o outros todos ficam selecionados, sendo que eu queria escolher bom esse eu quero selecionar, esse outro nao, esse sim, e assim por diante, ate implemente um TableCellEditor, antes que nao conseguia fazer com q a caixa fisca-se ‘riscada’, agora ela fica mas com esse pequena problema, de ficar ou todas selecionadas ou nenhuma selecionada… Gostaria de um help ai moçada…

Obrigado

Segue meu código, este é a minha TableModel…

public class ListaRemoverCarregamentoTModel extends AbstractTableModel {
    
    ArrayList lista = new  ArrayList();
    
    Controlar_RemoverCarregamento ctlremov;
    
    public  ListaRemoverCarregamentoTModel() {
        ctlremov = new Controlar_RemoverCarregamento();
        RemoverCarregamento carreg = new RemoverCarregamento();
        for (int i = 0;i<3;i++) {
            lista.add(carreg);
        }    
        
    }
    public  ListaRemoverCarregamentoTModel(String id) {
        ctlremov = new Controlar_RemoverCarregamento();
        //lista = cadprod.carregarListaProdCoresCad(id);
        CorDsv cor = new CorDsv();
        for (int i=lista.size();i<6;i++) {
            lista.add(cor);
        }
    }
    public  ListaRemoverCarregamentoTModel(ArrayList lista_) {
        ArrayList ls = new ArrayList();
        RemoverCarregamento carreg = new RemoverCarregamento();
        if (!lista_.isEmpty()) {
            for (int i = 0;i<lista_.size();i++) {
                carreg = (RemoverCarregamento) lista_.get(i);
                if (carreg.getStatus() != null) {
                    ls.add(lista_.get(i));
                }
            }
        }
        lista = ls;
        carreg = new RemoverCarregamento();
        for (int i=lista.size();i<6;i++) {
            lista.add(carreg);
        }
    }
    
    @Override
    public String getColumnName(int column) {
        
        String rs = "";
        switch (column) {
            
            case 0:
                rs = "Status";
                break;
            case 1:
                rs = "Plano Carga";
                break;
            case 2:
                rs = "Pedido";
                break;
            case 3:
                rs = "Cliente";
                break;
            case 4:
                rs = "Item";
                break;
            case 5:
                rs = "Qtd.Solic";
                break;
            case 6:
                rs = "Qtd.Atendida";
                break;
            default:
                rs = "";            
        }
        return rs;
    }
    
    @Override
    public Class getColumnClass(int columnIndex) {
        Class rs;
        switch (columnIndex) {
            case 0:
                rs = Boolean.class;
                break;
            case 1:
                rs = Integer.class;
                break;
            case 2:
                rs = Integer.class;
                break;
            case 3:
                rs = Integer.class;
                break;
            case 4:
                rs = String.class;
                break;
            case 5:
                rs = Float.class;
                break;
            case 6:
                rs = Float.class;
                break;
            default:
                rs = null;            
        }
        return rs;
    }
    
    @Override
    public int getRowCount() {
        return lista.size();
    }

    @Override
    public int getColumnCount() {
        return 7;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        RemoverCarregamento carreg = (RemoverCarregamento) lista.get(rowIndex);
        Object rs= "";
        switch (columnIndex) {
            case 0:
                if(carreg.getStatus()!=null){
                rs = carreg.getStatus();
                } else {
                    carreg.setStatus(Boolean.FALSE);
                    rs = carreg.getStatus();
                }
                break;
            case 1:
                rs = carreg.getPlano_carga();
                break;
            case 2:
                rs = carreg.getNum_pedido();
                break;
            case 3:
                rs = carreg.getCod_cliente();
                break;
            case 4:
                rs = carreg.getCod_item();
                break;
            case 5:
                rs = carreg.getQtd_solicitada();
                break;
            case 6:
                rs = carreg.getQtd_atendida();
                break;
            default:
                rs = ""; 
        }
        
        if (columnIndex == 0)
            return rs;
        else
            return rs;
                    
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        boolean[] canEdit = new boolean [] {true,false,false,false,false,false,false};
        return canEdit [columnIndex];
    }
   
    public void limpaLista() {
        int i = lista.size();
        lista.clear();
        fireTableRowsDeleted(0, i - 1);
    }
    public void remove(int indice) {
        lista.remove(indice);
        fireTableRowsDeleted(indice, indice);
    }
    public void setSelecionado(int rowIndex, Boolean value) {
        RemoverCarregamento carreg= (RemoverCarregamento) this.lista.get(rowIndex);
        
        carreg.setStatus(value);
    }
  
}

Está e a minha CheckBoxCellEditor


public class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
    private JCheckBox checkbox;
    private int rota;
    private int tamanho;
    private ListaRemoverCarregamentoTModel rtmodel;
    
    
    @Override
    public Object getCellEditorValue() {
        return checkbox;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        checkbox  = new JCheckBox();
        checkbox.setSelected(isSelected);
        table.setRowHeight(30);
        
        rota = row;
        rtmodel=(ListaRemoverCarregamentoTModel) table.getModel();
        tamanho = rtmodel.getRowCount();
        
        return checkbox;    
        
    }
    public void refreshTable(){
        getCellEditorValue();
    }
    
    @Override
    
    public boolean stopCellEditing() {
        rtmodel.setSelecionado(rota,checkbox.getModel().isSelected());
        return super.stopCellEditing();
         
    }



}

Essa e a minha beans que eu guardo…

public class RemoverCarregamento {
    private String cod_empresa;
    private int plano_mestre;
    
    private int plano_carga;
    private int num_pedido;
    private int cod_cliente;
    private String cod_item;
    private float qtd_solicitada;
    private float qtd_atendida;
    private Boolean status;

Não estou conseguindo fazer com q ele preencha um por vez, ou é tudo ou e nada…, alguem tem alguma solução?

Pra quem tiver a mesma dúvida, eu consegui resolver utilizando o seguinte metodo…

  @Override  
    public void setValueAt(Object value,int rowIndex,int columnIndex) {  
        int col = 0;  
        if (columnIndex == col) {  
            RemoverCarregamento carreg = (RemoverCarregamento) lista.get(rowIndex);  
            carreg.setStatus((Boolean) value);  
        }  
        fireTableDataChanged();  
    }  

Não há necessidade de criar CellEditor,TableCelleditor, para se obter um checkbox dentro de uma jtable, é somente fazer a estrutura de uma AbstractTableModel e aonde voce defini o tipo da sua coluna voce coloca Boolean, pois ele gera automatico…E quando a Jtable é modificada ela chama este metodo que eu postei acima, e no meu caso eu nao estava conseguindo só marcar somente um, eu clicava em um e todos era marcado, mas pelo fato que eu estava errado na minha lógica… Mas a base é essa galera…

Ate mais