JCheckBox em JTable - clicável

14 respostas
S

Olá pessoal, consegui inserir JCheckBox numa JTable com o seguinte código:

public TableCellRenderer getCellRenderer(int row, int column) 
					{
						if( column == 2 )
						{
							return getDefaultRenderer( Boolean.class );
						} 
						else
						{
							return super.getCellRenderer( row, column );
						}
					}

					public void setValueAt( Object aValue, int aRow, int aColumn )
					{
						Object o[] = ( Object[] ) this.elementAt( aRow );
						o[ aColumn ] = aValue;
					}

Porém o checkbox da coluna 2 não é clicável, já procurei e não achei nada a respeito, alguém sabe como tornar esse objeto clicável (habilitado)?

Agradeço desde já ;-)

[]'s

14 Respostas

D

Isso deve ser resolvido no modelo e não no renderer. Por exemplo:

public class MyModel extends AbstractTableModel {

          ...

   public Class getColumnClass(int column) {
         Class klass = String.class; // para todas as outras colunas use String
         // primeira coluna deve ser marcável
         if (column == 0) klass = Boolean.class;
         return klass;
   }

}
S

Bá, não entendi :frowning:

Tens algum exemplo em que isso funcione?

Já to desistindo, hehehe :frowning:

Valeu!

R

cara… qdo vc adiciona uma linha ao JTable, para criar uma coluna de CheckBox basta que o valor da respectiva coluna seja to tipo Boolean. Por exemplo:

modeloDaTabela.addRow(new Object[]{new Boolean(false), "Joao", "da Silva"}); modeloDaTabela.addRow(new Object[]{new Boolean(true), "Maria", "da Costa"});
esse codigo coloca os CheckBox na primeira coluna (de 3), sendo que a primeira está desmarcada e segunda marcada. Para ser clicável, basta vc implementar (ou sobrescrever) o metodo isCellEditable() de acordo com as suas necessidades. Lembrando que para isso funcionar é preciso implementar, novamente da maneira q melhor resolve seu problema, o método getColumnClass() do TableModel da sua tabela. :smiley:

S

Ok, esses dados booleanos vem do BD, e torno eles JCheckBox através do método abaixo:

public TableCellRenderer getCellRenderer(int row, int column) 
{
	if( column == 2 )
	{
		return getDefaultRenderer( Boolean.class );
	} 
	else
	{
		return super.getCellRenderer( row, column );
	}
}

Porém não consegui tornar eles clicáveis, por ex. checar e des-checar o checkbox, algum exemplo de método que resolva isso.

Que pau to tomando, na verdade preciso de um bom livro de swing ou sei lá :frowning:

Valeu!

D

Como eu disse antes toda a questão da coisa está no modelo. Você deve prover um modelo editável de dados e implementar os seguintes métodos (levando em consideração cada coluna editável do seu modelo):

isCellEditable(int, int)
setValueAt(Object, int, int)
getColumnClass(int, int)

Eis um exemplo completo funcionando:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Checked extends JFrame {

      public static void main(String[] args) {
            Runnable runner = new Runnable() {
                  public void run() {
                        Checked c = new Checked();
                        c.setVisible(true);
                  }
            };
            new Thread(runner).start();
      }


      public Checked() {

            super();
            setSize(400,300);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            JTable table = new JTable(new MyModel());

            Container c = getContentPane();
            c.setLayout(new BorderLayout());
            c.add(new JScrollPane(table), BorderLayout.CENTER);

      }

}


class MyModel extends AbstractTableModel {

      Object[][] data = new Object[16][2];

      public MyModel() {
            for (int i = 0; i < data.length; i++) {
                  data[i][0] = new Boolean(false);
                  data[i][1] = "Item " + i;
            }
      }

      public int getRowCount() {
            return data.length;
      }

      public int getColumnCount() {
            return data[0].length;
      }

      public Object getValueAt(int row, int col) {
            return data[row][col];
      }

      public boolean isCellEditable(int row, int col) {
            if (col == 0) return true;
            return false;
      }

      public Class getColumnClass(int column) {
            Class klass = String.class;
            if (column == 0) klass = Boolean.class;
            return klass;
      }

      public void setValueAt(Object value, int row, int col) {
            if (col == 0) data[row][col] = (Boolean)value;
      }

}
R

no seu caso, vc pode fazer:

public boolean isCellEditable(int linha, int coluna) { if( coluna == 2 ) { return true; } return false; }entendeu?

S

Valeu pelas dicas pessoal, acabei resolvendo esse problema não usando uma JTable, porém de qualquer forma ficam no fórum as dicas e exemplos desse post de como se resolver esse tipo de problema.

Obrigado a todos :slight_smile:

[]'s

F

Galera. como eu faria para adicionar linha por linha no jTable? vlw

C

Na verdade, você não adiciona a linha no Jtable, mas no modelo da JTable.

Se tabela é um JTable…

DefaultTableModel modelo = ( DefaultTableModel ) tabela.getModel();
modelo.addRow( //um vetor com os objetos que deseja inserir na linha ).
tabela.setModel( modelo );
C

Aproveitando o tópico:

Como insiro um JComboBox numa JTable?

I

Vc quer a Combo como uma célula da sua JTable???
É algo + ou - assim:

TableColumn timeColumn = table.getColumnModel().getColumn(4);//Pegará a quinta célula
JComboBox cB = new JComboBox();
cB.addItem("Flamengo");
cB.addItem("Vasco");
cB.addItem("Botafogo");
timeColumn.setCellEditor(new DefaultCellEditor(cB));

Leia aqui, que tem código pronto para isso:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

F

Carvanelli, eu teria que implementar a reorganização do vetor dentro do modelo da jtable?

F

Obrigado a todos. Já consegui resolver o meu problema, quem quiser conferir só entrar nesse tópico:

http://www.guj.com.br/posts/list/88484.java

C

Vc quer a Combo como uma célula da sua JTable???
É algo + ou - assim:

TableColumn timeColumn = table.getColumnModel().getColumn(4);//Pegará a quinta célula
JComboBox cB = new JComboBox();
cB.addItem("Flamengo");
cB.addItem("Vasco");
cB.addItem("Botafogo");
timeColumn.setCellEditor(new DefaultCellEditor(cB));

Leia aqui, que tem código pronto para isso:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

Valeu, muito obrigado, era isso mesmo o que eu queria.

Criado 21 de julho de 2006
Ultima resposta 21 de abr. de 2008
Respostas 14
Participantes 6