Jcheckbox dentro do Jtable no Netbeans

Amigos, pesquisei bastante aqui no fórum, porém não encontrei a solução do meu problema… o que tá acontecendo é o seguinte… tenho um jTable que retorna somente uma coluna, entretanto quero criar outra coluna com jcheckboxs em cada linha… tipo:

Categoria|coluna com o checkbox|

ativo | check
desligad | check
.
.
.
encontrei no fórum a opção de criar a coluna com o resultado do banco de dados… mas no meu caso quero colocar os checkbox para saber as categorias escolhidas e fazer o filtro no banco.

Desde já agradeço a todos,

Willian Baldez

Basta fazer seu TableModel retornar Boolean.class para o tipo da coluna.
Aí vc trata o que foi ou não marcado no método setValueAt.

Fala ViniGodoy, você pode me ajudar? vi alguns foruns que você e o Mark ensinaram a criar “meu prorpio” AbstractModel, bom pesquisando nesses foruns consegui criar o meu… mas não consegui fazer uma coisa, recuperar os dados para alteração e exclusão que seria o ID da linha, mas não quero que o ID apareça no jtable, vou postar o código para ver se vc pode me ajudar.

Classe onde fica meus getters e setters


package CamadaDeTeste;
/**
 * @author willianbaldez
 */
public class TestePlano {
    private String nome;
    private double valor;
    private int idCadPlano;

    public int getIdCadPlano() {
        return idCadPlano;
    }

    public void setIdCadPlano(int idCadPlano) {
        this.idCadPlano = idCadPlano;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }
}

classe onde fica meus métodos - DAO

package CamadaDeTeste;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import regraDeNegocio.Conexoes_BD;

/**
 *
 * @author willianbaldez
 */
public class TestePLanoDAO {

    private Connection con;
    public List<TestePlano> lista = new ArrayList<TestePlano>();
    private ResultSet rs;

    public List<TestePlano> TestePLanoDAO() {
        Conexoes_BD.conectaAcademia();
        try {            
            rs = Conexoes_BD.stam.executeQuery("Select * from cadplano");
            while (rs.next()) {
                TestePlano contato = new TestePlano();
                contato.setIdCadPlano(Integer.parseInt(rs.getString("IDCADPLANO")));
                contato.setNome(rs.getString("NOME"));
                contato.setValor(Double.parseDouble(rs.getString("VALOR")));
                lista.add(contato);
            }
        } catch (SQLException e) {
            System.out.println(e);
        }
        return lista;
    }
}

Meu table Model

package CamadaDeTeste;
import java.util.List;
import javax.swing.table.AbstractTableModel;


public class TestePLanoTableModel extends AbstractTableModel {

    private static final int COL_IDPLANO = 0;
    private static final int COL_NOME = 1;
    private static final int COL_VALOR = 2;
    
    private List<TestePlano> lista;

    public TestePLanoTableModel(List<TestePlano> lista) {
        this.lista = lista;
    }
    public int getRowCount() {
        return lista.size();
    }
    public int getColumnCount() {
        return 3;
    }

    @Override
    public String getColumnName(int column) {
        if (column == COL_IDPLANO) return "#";
        if (column == COL_NOME) return "Nome";
        if (column == COL_VALOR) return "Valor";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
        TestePlano titulo = lista.get(row);
        if (column == COL_NOME) return titulo.getNome();
        else if (column == COL_VALOR) return titulo.getValor();
        else if (column == COL_IDPLANO) return titulo.getIdCadPlano();
        throw new IllegalArgumentException("Invalid column");
        //return ""; //Nunca deve ocorrer
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        TestePlano titulo = lista.get(rowIndex);
        if (columnIndex== COL_NOME) titulo.setNome(aValue.toString());
        else if (columnIndex== COL_VALOR) titulo.setValor(Double.parseDouble(aValue.toString()));
        else if (columnIndex== COL_IDPLANO) titulo.setIdCadPlano(Integer.parseInt(aValue.toString()));
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {

        if (columnIndex == COL_NOME) {
            return String.class;
        } else if (columnIndex == COL_VALOR) {
            return Double.class;
        } else if (columnIndex == COL_IDPLANO) {
            return Integer.class;
        } else {
            return String.class;
        }
    }

    public TestePlano get(int row) {
        return lista.get(row);
    }
}

Se vc me ajudar eu agradeço.

Tenho uma dúvida, a classe DAO que foi dita nos foruns, é onde fica meus métodos, é isso?


Willian Baldez

Com seu model próprio, fica ridiculamente simples. Veja:

TestePlanoTableModel model = (TestePlanoTableModel)seuTable.getModel(); TestePlano plano = model.get(seuTable.getSelectedRow()); //Obtém o TestPlano da linha selecionada int id = plano.getIdCadPlano();

Note que não há nenhuma obrigatoriedade quanto ao campo id ser ou não visível. O model só indica para o table o que exibir e aonde, mas cada linha contém um TestePlano, e não um conjunto de objects não relacionados (como seria no Default).

Muito obrigado ViniGodoy, a sacada era int id = plano.getIdCadPlano(); não tinha feito isso… Valeu mesmo…Agora vou fazer o que você me sugeriu a respeito do jCheckbox.

:smiley: vlw!