JCheckBox em JTable - clicável

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

[code]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;
				}[/code]

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á :wink:

[]'s

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

[code]
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;
}

}[/code]

Bá, não entendi :frowning:

Tens algum exemplo em que isso funcione?

Já to desistindo, hehehe :frowning:

Valeu!

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:

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!

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:

[code]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;
  }

}[/code]

no seu caso, vc pode fazer:

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

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

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

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 );

Aproveitando o tópico:

Como insiro um JComboBox numa JTable?

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

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

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

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
[/quote]

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