Instanciando e populando uma JTable

Certo. Mas eu gostaria de alterar o valor do checkBox após a tabela ser renderizada. Como faço isso?

Consegui.

Primeiro deixei só a primeira coluna (checkbox) editavel:

@Override
	public boolean isCellEditable(int linha, int coluna){
		if(coluna ==0)
			return true;
		else
			return false;
	}

Depois sobreescrevi o método setValueAt(Object aValue, int rowIndex, int ColumnIndex)

@Override
	public void setValueAt(Object aValue, int rowIndex, int ColumnIndex){
		NotaFiscal nota = dados.get(rowIndex);
		if(ColumnIndex == 0){
			nota.setCheck(!nota.isCheck());
		}
	}

Exatamente. Melhor ainda quando você perceber que pode usar o “get” do model para nunca mais trabalhar com o setValueAt:

int selected = table.getSelectedRow(); NotaFiscal nf = model.get(selected); nf.setCheck(!nf.getCheck()); model.fireTableRowsUpdated(selected, selected);

Geralmente eu implemento o método get do model para retornar o objeto na linha selecionada (ele só repassa para o get do ArrayList interno). Assim você passa a trabalhar com objetos de negócio fora da sua tabela. :slight_smile:

Poderia postar o método get e tb o fireTableRowsUpdated.

O método fireTableRowsUpdated faz parte do AbstractTableModel. Ele não precisa ser implementado. Serve para você avisar a tabela que de aquelas linhas tiveram atualização de valor, para ela se redesenhar.

Como eu falei, o método get seria simplesmente:

public NotaFiscal get(int row) { return dados.get(row); }

[quote=ViniGodoy]Exatamente. Melhor ainda quando você perceber que pode usar o “get” do model para nunca mais trabalhar com o setValueAt:

int selected = table.getSelectedRow(); NotaFiscal nf = model.get(selected); nf.setCheck(!nf.getCheck()); model.fireTableRowsUpdated(selected, selected);

Geralmente eu implemento o método get do model para retornar o objeto na linha selecionada (ele só repassa para o get do ArrayList interno). Assim você passa a trabalhar com objetos de negócio fora da sua tabela. :)[/quote]

Só não entendi onde usar o código que vc postou aqui. Com o uso do setValueAt, o checkbox já altera conforme eu clico.

Nesse caso pode parecer mais complicado.

Mas considere que você pode, alterar dados que não estão na tabela, ou chamar outros métodos de negócio. Só estava ressaltando que com um TableModel próprio, é interessante trabalhar com as classes de negócio diretamente, e não mais com dados dispersos, como muitas vezes ocorre ao usar o getValueAt e setValueAt.

Entendi.

Realmente é melhor já ter todo objeto. Mas não entendi onde usar esse código. Como reconhecer o clique no checkbox pra chamar esse código?

Ah, desculpe, entendi que você queria um método para alterar o valor da checkbox programaticamente, sem o clique.

Ah não.

Minha ideia é popular a tabela com a listagem das notas e, inicialmente, todos os checkbox são false.

O cliente, então, pode selecionar quais as notas ele deseja. E após a seleção, clicar no botão Validar/Assinar/Enviar para que seja executado a tarefa (nessa hora poder usar diretamente a lista, só verificando o valor do check, vai facilitar bastante).

Tem como eu setar a largura das colunas da minha tabela?

Consegui seguindo esse post:
http://www.guj.com.br/java/240285-redimensionar-largura-das-colunas-de-jtable-com-tablemodel-proprio