Colocar um JCheckBox em uma coluna de uma tabela

14 respostas
D

pessoal alguem sabe me dizer como eu posso colocar um JCheckBox dentro de uma coluna de uma tabela, na verdade dentro de todas as células de uma coluna de uma tabela..

eu fiz da seguinte maneira mais não funciona

JCheckBox check = new JCheckBox();

Object[][] obj = new Object[][]{{check,"","",""}};
        String[] colunas = new String []{"JCheckBox","Coluna2","Coluna3","Coluna4"};
        
        DefaultTableModel modelo = new  DefaultTableModel(obj,colunas) {
            
            Class[] types = new Class [] {
                javax.swing.JCheckBox.class, java.lang.String.class,java.lang.String.class,java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                true, false,false,false
            };
            
            
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
            
        };
        
        //desenha a tabela no modelo acima
        minhaTabela = new JTable( modelo );

14 Respostas

J

Segundo o Core Java 2, o objeto Boolean já tem um renderer pré-definido, e é o check box… mas não consegui fazer funcionar quando tenho um boolean em uma linha toda da tabela. Por coluna funciona, mas não lembro como…

pessoal, Exemplos?

V

Sobrescreva também o método getColumnClass do DefaultTableModel pra retornar Boolean.class para coluna deseja.

O que eu recomendo mesmo é não usar o DefaultTableModel. Ao invés disso, implemente seu próprio filho de AbstractTableModel e deixe o seu programa mais simples, organizado e funcional!

Ponha logo abaixo do método isCellEditable:

public Class<?> getColumnClass(int column) { if (column == 0) return Boolean.class; return super.getColumnColumnClass(column); }

Ou, como você já tem um array com as classes:

public Class<?> getColumnClass(int column) { return types[column]; }

J

Valeu vinigodoy,

Existe um getRowClass? Como faço para obter o renderer do Boolean se todos os checks ficarão em uma linha, e não na coluna?

D

o jcvijr

teria como vc passar pra mim como vc fez , eu não to conseguindo fazer aqui
eu sou meio novo com programação java e to tendo um pouco de dificuldade
vlw

V

Não tem um getRowClass(), infelizmente.

Entretanto, não é muito difícil fazer um filho de JTable que faça isso.
A classe JTable tem o método getCellRenderer() que pode ser sobrescrito.

Uma possível maneira de fazer isso, é inverter o método (nesse caso, a tabela usaria a column class para as linhas, ao invés das colunas):

suaTabela = new JTable() { @Override public TableCellRenderer getCellRenderer(int row, int column) { super.getCellRenderer(column, row); } }

V

Ah sim, você pode ainda fazer algo mais elaborado, como nesse artigo que escrevi! :wink:

V

diegopangone:
o jcvijr

teria como vc passar pra mim como vc fez , eu não to conseguindo fazer aqui
eu sou meio novo com programação java e to tendo um pouco de dificuldade
vlw

Diego, qual foi o problema que você teve ao recortar o código que coloquei ali em cima e colar abaixo do isCellEditable que você implementou?

D

ViniGodoy

então eu coloco esse código q vc me passou mais quando eu executo o programa dentro da minha celula da tabela ao invés de aparecer um JCheckBox, aparece somente um texto la dentro
esse aqui abaixo

javax.swing.JCheckBox[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,
border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@1100d7a,
flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,
disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,
left=2,bottom=2,right=2],paintBorder=false,paintFocus=true,pressedIcon=,
rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,
text=]

V

No caso, o primeiro tipo do seu vetor types deveria ser Boolean.class e não JCheckBox.class.

O tipo refere-se ao dado da célula, não a quem vai edita-la.

O mesmo vale para o que está dentro da célula. Ao invés de adicionar check, adicione um valor booleano, como Boolean.FALSE.

V

O código final ficaria mais ou menos assim (não testei):

Object[][] obj = new Object[][]{{Boolean.TRUE,"","",""}};
         String[] colunas = new String []{"JCheckBox","Coluna2","Coluna3","Coluna4"};
         
         DefaultTableModel modelo = new  DefaultTableModel(obj,colunas) {
             
             Class[] types = new Class [] {
                 Boolean.class, java.lang.String.class,java.lang.String.class,java.lang.String.class
             };
             boolean[] canEdit = new boolean [] {
                 true, false,false,false
             };
             
             
             public boolean isCellEditable(int rowIndex, int columnIndex) {
                 return canEdit [columnIndex];
             }

             public Class<?> getColumnClass(int column) {
                 return types[column];
             }             
         };
         
         //desenha a tabela no modelo acima
         minhaTabela = new JTable( modelo );
D

ViniGodoy

deu certinho cara mais pelo que parece o que eu fiz foi apenas criar uma célula to tipo Boolean, e não adicionar um JCheckBox (SWING) dentro dela, como eu faria então para adiconar por exemplo um JButton ouw um JProgressBar por exemplo??

V

No Swing, as coisas são divididas assim:

Os models conhecem os dados que irão na tabela. Eles não tem qualquer informação sobre componentes ou como a tabela será desenhada. Isso dá flexibilidade, uma vez que uma tabela em modo texto também poderia ser usada.

O model também dispara eventos, para avisar que os dados foram alterados. Existem método por lá como fireTableDataChanged(), para notificar a tabela de que é hora de atualizar os dados.

Quem conhece e sabe desenhar as coisas é a JTable. Nela, existem métodos como setDefaultCellRenderer (Class<T>, TableCellRenderer), ou setDefaultCellEditor(Class<T>, TableCellEditor) que permitem que você configure para cada classe um renderer ou editor diferente.

Então, se você precisar definir um progress bar diferente, deverá fazer os seguintes passos:

  1. Seu model deverá retornar um valor, que será colocado na barra. Equivale ao value() da barra;
  2. Você deve criar um tableCellRenderer que exiba a barra;
  3. Você deve dizer a tabela que para o tipo Integer.class, o editor default é o seu renderer;
  4. No seu TableModel, indique a coluna com a barra como Integer.class

Note que, se você já usa Integer.class para outras coisas, poderia substituir por qualquer tipo, mesmo que isso não seja realidade para o dado.

Para mais informações, consulte o tutorial da sun How to use tables.

D

afff é trabalhoso pra pacas heim…
mais blz Vini vc ja me ajudou muito, vou dar uma pesquisada aqui pra ver como q faz , mais c vc tiver algum exemplo ai q vc implementou e vc puder me passar eu ficarei muito grato…

cara vlw mesmo heim , muito obrigado!!!

V

É um pouco trabalhoso sim, mas depois que você pega a filosofia, vê que tem muitas vantagens.

  1. Clareza do código / facilidade de manutenção;
  2. Desacoplamentos dos dados para a representação desses mesmos dados;
  3. Capacidade de fazer praticamente o que você quiser na tabela.
Criado 12 de abril de 2007
Ultima resposta 13 de abr. de 2007
Respostas 14
Participantes 3