JComboBox em JTable - ComboBox diferentes em uma mesma coluna [RESOLVIDO]

Pessoal, estou tentando fazer isso há dias já e não encontro em lugar nenhum como fazer.

Eu preciso colocar em uma tabela uma coluna que deve ter um comboBox específico para cada linha.

Alguém já fez isso? Pode me dizer como faz e/ou postar um exemplo?

Obrigado

No seu model, defina o valor de retorno da coluna em questão como Boolean.class. Você faz isso no método getColumnClass.
Depois, é só retornar um boolean no getValueAt normalmente.

Se você não faz idéia do que seja um TableModel, leia aqui:
http://www.guj.com.br/posts/list/132698.java#714736

cara, obrigado pela ajuda, mas será que você não está confundindo checkBox com comboBox?

Ops, desculpe.

Para colocar um ComboBox você precisará definir um redenderer específico para sua coluna. E retornar uma lista no getValueAt.

[quote=ViniGodoy]Ops, desculpe.

Para colocar um ComboBox você precisará definir um redenderer específico para sua coluna. E retornar uma lista no getValueAt. [/quote]

Ok, retornar uma lista no getValueAt eu entendo, mas esse renderer especifico para coluna seria como?

Aliás, é melhor não definir um Renderer e sim um Editor:

public class MyComboBoxEditor extends DefaultCellEditor { public MyComboBoxEditor(Object[] items) { super(new JComboBox(items)); } }

Depois chame o método setDefaultCellEditor para que o JTable reconheça esse como o editor padrão da classe array. Por fim, retorne a classe de Array no getColumnClass() do seu model.

Estou tentando fazer desse jeito, mas assim fica o jComboBox com os mesmos valores para todas as linhas da coluna. Eu precisava que cada linha tivesse seu próprios valores para o jComboBox.

Alguma idéia?

Você quer que cada linha tenha uma lista do JComboBox diferente?

Normalmente, nas linhas ficam combos com o mesmo conjunto de valores, e só o que muda é o valor escolhido.

Isso mesmo.

Estou quase conseguindo, mas estou com um problema ainda.

Eu estou fazendo o seguinte, eu pego a coluna aonde eu quero meu comboBox e defino o cellEditor dela :

TableColumnModel columnModel = jtMovel.getColumnModel(); TableColumn tableColumn = columnModel.getColumn(OrdemTable.COL_SUPERMERCADO-OrdemTable.COLUNAS_FIXAS); tableColumn.setCellEditor(new SupermercadoCellEditor());

O meu editor:

[code] private class SupermercadoCellEditor extends AbstractCellEditor
implements TableCellEditor {
private JComboBox field;
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
field= new JComboBox((SupermercadoProduto[])value);
return field;
}

	@Override
	public Object getCellEditorValue() {
		return field.getSelectedItem();
	}
}[/code]

Porem, o meu tableModel precisa retornar um Object[] (no método getValueAt(int row, int column)) para o editor poder criar o ComboBox. Aí, se ele retornar um object[], funciona tudo bem, só que a visualização da tabela que fica errada (ela tenta converter para String o meu Object[]).

Eu devo criar um renderer para célula?

Ok, problema resolvido.

A situação é que eu possuo uma tabela de produtos (eles não podem repetir), e cada produto pode ser encontrado em diversos supermercados, não necessariamente os mesmos para cada produto.

Nesta tabela há informações sobre os produtos referentes ao supermercado em que se encontra, como o preço. (Cada produto em um supermercado tem um preço)

Minha tabela é mais ou menos assim então: Produto, Supermercado, Preço.

O que eu precisava era de comboBoxs para que o usuário escolhesse o supermercado e a tabela automaticamente mostrasse as informações deste produto no supermercado selecionado.

O que eu fiz no final foi o seguinte:

No meu tableModel, para o getValueAt da coluna do supermercado eu retorno somente a descrição deste supermercado:

public Object getValueAt(int row, int column) { Ordem o=valores.get(row); boolean selecao=selecionados.get(row); SupermercadoProduto[] sp=superProds.get(row); switch (column) { case COL_SUPERMERCADO: return o.getSupermercadoProduto().getSupermercado().getDescricao();

Para a coluna onde eu quero o jComboBox eu defino o meu próprio cellEditor:

TableColumnModel columnModel = jtMovel.getColumnModel(); TableColumn tableColumn = columnModel.getColumn(OrdemTable.COL_SUPERMERCADO-OrdemTable.COLUNAS_FIXAS); tableColumn.setCellEditor(new SupermercadoCellEditor());

E no meu editor, para pegar os valores do comboBox, eu tive que apelar: Eu pego o código do produto (minha cheve primária da tabela) da linha editada, e busco no modelo as informações para o comboBox:

[code] private class SupermercadoCellEditor extends AbstractCellEditor
implements TableCellEditor {
private JComboBox field;
private SupermercadoProduto[] supers;
//Ao editar a célula este método cria um jComboBox
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {

		//Na tabela não existe o array com os supermercados em que o produto se encontra, só o modelo tem essa informação
		//Então pela chave primária da tabela, eu busco o array no modelo
		String produtoCodigo=(String) getTabelaFixa().getValueAt(row,OrdemTable.COL_CODIGO);
		for(int i=0;i<getControlador().getModelo().getModeloTabela().getRowCount();i++){
			if(produtoCodigo.compareTo((String)getControlador().getModelo().getModeloTabela().getValueAt(i, OrdemTable.COL_CODIGO))==0){
				supers=(SupermercadoProduto[]) getControlador().getModelo().getModeloTabela().getValueAt(i, OrdemTable.COL_SUPERSPRODS);
				i=getControlador().getModelo().getModeloTabela().getRowCount();
			}
		}
		
		//Defino os valores para o comboBox
		String[]combo=new String[supers.length];
		for(int i=0;i<supers.length;i++){
			combo[i]=supers[i].getSupermercado().getDescricao();
		}
		//Crio e retorno o comboBox
		JComboBox comboBox=new JComboBox(combo);
		comboBox.setSelectedItem(value);
		field=comboBox;
		return field;
	}

	//Ao final da edição o valor retornado para o TableModel vem desta função.
	@Override
	public Object getCellEditorValue() {
		return supers[field.getSelectedIndex()];
	}
}

[/code]

É isso, obrigado pela ajuda e fica aí a solução.

Abraços