[RESOLVIDO] jCheckbox no jTable - Não sei como!

28 respostas
macdown

Pessoal, li um tutorial da sun e vi varios topicos sobre isso e não entendi ainda como colocar.
Alguem poderia me ajudar nisso?

Olha como esta, o jcheckbox vai ficar na coluna 0.

private void mostrarClientes(List<CampoCliente> clientes) { while (tmClientes.getRowCount() > 0) { tmClientes.removeRow(0); } if (clientes.size() == 0) { JOptionPane.showMessageDialog(this, "Não foi encontrado nenhum cliente!"); } else { String[] campos = new String[] {null, null}; for (int i = 0; i < clientes.size(); i++) { //O jCheckbox ficaria na coluna 0 tmClientes.setValueAt(clientes.get(i).getNome(), i, 1); } } }

Muito obrigado.

28 Respostas

ViniGodoy

Basta fazer com que o método getColumnClass() do seu TableModel retorne Boolean.class para aquela coluna.

Como vc implementou o seu TableModel?

macdown

hahaha, Vini não vou falar não!!! Você vai me matar!!! Default…tâ nâ nâ…

Eu ainda nao aprendi direito o metodo de abstract de table e etc…

Vc tem um exemplo de como fazer isso???
Esse boolean.class

Valewwwwwwwwwwwwwww

pedroroxd

macdown:
hahaha, Vini não vou falar não!!! Você vai me matar!!! Default…tâ nâ nâ…

Eu ainda nao aprendi direito o metodo de abstract de table e etc…

Vc tem um exemplo de como fazer isso???
Esse boolean.class

Valewwwwwwwwwwwwwww


kkkk
ainda bem que vc sabe né?
“errar é humano, persistir no erro (sabendo que é errado) é burrice” - não to te chamando de burro não, só estou citando uma frase conhecida! =P

Então, quanto ao getColunClass(), tem um exemplo do vinigodoy aki:
http://www.guj.com.br/posts/list/132698.java#714736

Mas de qualquer geito vai ter que fazer seu model…
Criando uma classe e fazendo o extend dela pra AbstractTableModel

Depois vc vai criar o método:

public Class getColumnClass(int columnIndex) { //Qual a classe da coluna? Se for texto, é string: return String.class; //mas no seu caso vai ser boolean: return Boolean.class; }
Só estou falando por cima…
Leia o post ali em cima do vini…

macdown

hahahahah, putz!!! Pedro pegou pesado hein??? kakakaakakakkaka…tô zuando.
Muito obrigado, vu ler o post que me passou e aprender a fazer esse tipo de tabela.

Valew mesmo pela ajuda.

Abraço.

ViniGodoy

Não é “aprender a fazer esse tipo de tabela”, e sim, “aprender a fazer tabelas”.

O DefaultTableModel não pode ser considerado desenvolvimento sério. É o jeito mais difícil de se fazer tabelas.

macdown

Vini, sabe o post que colocou exemplo de tabela? (http://www.guj.com.br/posts/list/132698.java#714736)
Então você tem algum arquivo de exemplo com ela montada?

Eu usei o exemplo e não consegui usar algumas coisas mesmo encapsulando e etc… deu uns erros!!! Estou usando alguma coisa de forma errada.

Como você mesmo falou, hehheeheh, quero aprender a fazer tabelas!!! =)))

Olha, muito obrigado. :smiley:

ViniGodoy

Posta o model que você montou e diz que erros tão dando, que a gente ajuda.

macdown

Vamos lá:

Eu construi um projeto e dentro dele tem,

Tabela.java (jFrame)
CampoCliente.java (Classe Java)
ExTableModel.java (Classe Java)

Arquivo ExTableModel.java:
[color=red]Esta dando erro! Não estou sabendo construir[/color]

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author CodeBlack
 */
public class ExTableModel extends AbstractTableModel {
    private static final int COL_ID = 0;
    private static final int COL_NOME = 1;

    private List<CampoCliente> clientes;

    public NomeTableModel (List<CampoCliente> clientes) {
        this.clientes = new ArrayList<CampoCliente>(clientes);
    }

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

    public int getColumnCount(){
        return 2;
    }

    public String getColumnName(int column){
        if (column == COL_ID) return "ID";
        if (column == COL_NOME) return "Nome";
        return "";

    }

    public Object getValueAt(int row, int column) {
        CampoCliente nome = clientes.get(row);
        if (column == COL_ID) return nome.getIdcliente();
        else if (column == COL_NOME) return nome.getNome();
        return "";
    }

    public  void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        if (columnIndex== COL_ID) nome.setIdcliente(aValue.toString());
        else if (columnIndex== COL_NOME) nome.getNome().setNome(aValue.toString());
    }

    public  Class getColumnClass(int columnIndex) {
        return String.class;
    }

    boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    public CampoCliente get(int row) {
        return clientes.get(row);
    }
}

Arquivo CampoCliente.java:

public class CampoCliente {

    private Integer idcliente;
    private String nome;

    /**
     * @return the idcliente
     */
    public Integer getIdcliente() {
        return idcliente;
    }

    /**
     * @param idcliente the idcliente to set
     */
    public void setIdcliente(Integer idcliente) {
        this.idcliente = idcliente;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

}

Arquivo Tabela.java:

public class Tabela extends javax.swing.JFrame {

   
    public Tabela() {
        initComponents();

        tbClientes.setModel(new ExTableModel(/*Não sei o que tem que colocar aquiiiii!!!!!!*/));
    }

    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tbClientes = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tbClientes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(tbClientes);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(14, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Tabela().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tbClientes;
    // End of variables declaration                   

}

Esse é o codigo!!!

ViniGodoy

Bom, veja seu método setValueAt. Nele falta obter CampoCliente da linha. Outra coisa, o campo id é Integer, então, você deve retornar Integer.class na coluna dele.

public  void setValueAt(Object aValue, int rowIndex, int  columnIndex) {  
   CampoCliente nome = clientes.get(rowIndex); //Faltou isso aqui

   if (columnIndex== COL_ID) nome.setIdcliente((Integer)aValue);  //Id é Integer
   else if (columnIndex== COL_NOME) nome.setNome(aValue.toString());  

   return null;
}

public  Class<?> getColumnClass(int columnIndex) {  
    return columnIndex == COL_ID ? Integer.class : String.class;  
}
ViniGodoy

Agora na sua tela. Você deve fazer:

tabela.setModel(new ExTableModel(new ArrayList<CampoCliente>()));

E aí pode tirar toda aquela parafernalha do DefaultTableModel de lá.

macdown

Vini,

Nossa!!! Você acredita que ainda tá dando uns errinhos. Não onde fez as correções.
Só para otimizar o seu tempo e a sua boa vontade, você tem tem um projetinho simples igual esse ai que fiz funcionando?
Assim vou estudando sem te atrapalhar muito.

Não estou sabendo fazer.
=)))

Ai vc pode me mandar por e-mail e ou por outro lugar.
Abraço.

O negocio tá feio aqui viu!!! kakakaakak…

ViniGodoy

Não tenho. Mas facilita muito se você disser “quais” errinhos estão dando.

macdown

Vamos lá:

No codigo corrigido:

public  void setValueAt(Object aValue, int rowIndex, int  columnIndex) {     
   CampoCliente nome = clientes.get(rowIndex); //Faltou isso aqui   
  
   if (columnIndex== COL_ID) nome.setIdcliente((Integer)aValue);  //Id é Integer   
   else if (columnIndex== COL_NOME) nome.getNome().setNome(aValue.toString());     
  
   return null;   
}

Precisa ter o .getNome()? Porque ele tá com erro no .setNome.

E o return null tambem dando erro.

O codigo boolean:

boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

Tambem com erro.

E tambem o:

public NomeTableModel (List<CampoCliente> clientes) {
        this.clientes = new ArrayList<CampoCliente>(clientes);
    }

Esta com erro, [color=red]public NomeTableModel (List clientes) [/color]{ esta com uma linha vermelha.

Vini, nossa desculpa por estar te enchendo...
Mais tá feio aqui viu!!!!

Muito obrigado, abraço.

ViniGodoy

Não precisa daquele getNome(). Aliás, não pode ter ele não.

Ponha o mouse sobre as linhas vermelhas e diga o erro que elas acusam.

Verifica também se tem o

import java.util.List;

import java.util.ArrayList;

No início do seu módulo.

macdown

O import tem os 2.

public NomeTableModel (List<CampoCliente> clientes) { this.clientes = new ArrayList<CampoCliente>(clientes); }

Metodo declarado é invalido [color=red]((invalid method declaration; return type required)[/color]

boolean isCellEditable(int rowIndex, int columnIndex) { return true; }

[color=red](isCellEditable(int,int) in ExTableModel cannot implement isCellEditable(int,int) in javax.swing.table.TableModel; attempting to assign weaker access privileges; was public)[/color]

pedroroxd

falto o public

ViniGodoy

O primeiro erro é pq sua classe chama-se:
ExTableModel

E você está tentando usar o construtor com o nome de
NomeTableModel.

Você pode corrigir alterando o nome da classe para NomeTableModel ou o nome do construtor para ExTableModel. Veja vc o que é melhor no seu caso.

O segundo erro é pq o método isCellEditable deve ser public.

public boolean  isCellEditable(int rowIndex, int columnIndex) {
macdown

hahahah, nossa é verdade!!!!
Que mancada!!!

Sabe esse codigo:

public  void setValueAt(Object aValue, int rowIndex, int  columnIndex) {
   CampoCliente nome = clientes.get(rowIndex); //Faltou isso aqui

   if (columnIndex== COL_ID) nome.setIdcliente((Integer)aValue);  //Id é Integer
   else if (columnIndex== COL_NOME) nome.setNome(aValue.toString());

   return null;

Você colocou um return null!!!
E ele tambem esta com erro: [color=red](Cannot return a value from method whose result type is void)[/color]
Posso tirar o null???
É obrigado a colocar @override????? Ele fica com uma (!)

Sabe de uma coisa, tenho certeza queeeee, você Vini e Pedro não vão querer me ver tão cedo aqui viuuuu!!! =)))
Espero que esse post ajude muita gente tambem que estão con esses problemas, pois existem muita gente ainda que usa DefaultTableModel ainda.

Não sei como agradecer tudo isso.
Um forte abraço.

pedroroxd

Só tira o return…
Quando é void não tem retorno…

Ex.:

public String voltastring() { String m = "olá"; return m; }
E

public void setastring() { //faz algo, mas não retorna nada }

Pode ter certeza que agente quer vc aki no forum sim!
E é melhor vc tirar todas as dúvidas agora e se converter ao seu table model do que resolver seu problema com o DTA e mais pra frente ter muitos outros problemas.

Agradeça continuando ativo no forum, não só para postar dúvidas, mas para ajudar o povo! Bons estudos =)

macdown

Poxa, muito obrigado Pedro!!!
Ativo no forum (Sempre) =)))

Bom, isso é verdade!!! Posso dizer que aprendi muito com vocês.
DefaultTableModel nunca maissssssssssss…

=))))

Obrigado.
Abraço.

ViniGodoy

Vai por mim, é melhor gastar todo tempo do mundo para você entender certinho como o TableModel funciona, do que vc vir aqui com um código gigante, cheio de uso do DefaultTableModel, e pergutando onde tá errado…

Assim, não só o seu programa fica mais fácil e simples para você, como futuras dúvidas ficam mais tranquilas para nós. :slight_smile:

macdown

Isso é verdade, Vini!!!

Na minha tela PRINCIPAL eu faço assim:

Eu inicializo uma nova tabela e ai coloco esse codigo aqui?

minhaTabela.setModel(new ExTableModel(new List<CampoCliente>()));

Só que o NetBeans fica pedindo para implementar os metodos.

=\

Ai eu me enrroleiiii… =))

Cara, esse post se torno um super tutorial bem detalhado para não usar mais o DTM. heheheehehe

ViniGodoy

Fica pedindo para você implementar quais métodos?

macdown

Se eu colocar o mouse em cima do erro aparece: (java.util.List is abstract; cannot be instantiated)

Se eu clicar, aparece, instanciar todos metodos abstratos

ViniGodoy

É que é new ArrayList não new List.

minhaTabela.setModel(new ExTableModel(new ArrayList<CampoCliente>()));
macdown

Aeeeeeeeeee…
Showwwwwwwwww!!! Tudo certo, gostei de fazer tabelas, dei muito trabalho para vocês!!!
Gostaria de agradecer mais uma vez!!!(Pedro e Vini pela colaboração e paciencia!)

E colocar aqui que todo mundo que tiver duvida de como se fazer uma tabela, dar uma lida nesse post que vcs detalharam bastante.
Seguindo tudo se chega ao sucesso.

Abraço…

:stuck_out_tongue: :stuck_out_tongue:

pedroroxd

Boa, parabéns!
Depois vc vai no primeiro post, clica editar e acrescenta [RESOLVIDO] no título do tópico
Bons estudos :stuck_out_tongue:

macdown

Obrigado!!! =)))

Nossa tinha esquecido de colocar resolvido!!! =))

Valewwwww

Criado 3 de maio de 2010
Ultima resposta 4 de mai. de 2010
Respostas 28
Participantes 3