JComboBox - setSelectedItem( obj)

Galera, eh o seguinte:

Pq quando eu chamo o metodo setSelectedItem(x) passando x, que eu quero que fique selecionado, o JComboBox substitui o item na lista de itens do combo?

Gostaria de apenas selecionar o item que é “item.equals( x)”, e nao substituir item, mudando a referencia. Tem como fazer isso? Vcs entenderam o problema?

[]´s Gustavo Cabral

Hmmm, não entendi o que vc quis dizer não.

O JComboBox tem os métodos setSelectedIndex(int) e setSelectedItem(Object). Este último tem comportamentos ligeiramente diferentes quando o JComboBox é editável ou não. Em ambos os casos, se o objeto passado como argumento (lembre-se: a referência do objeto) existir na lista do JComboBox ele será selecionado e irá disparar um ItemEvent.SELECTED.

Se você for um pouco mais específico, talvez eu (ou alguém) possa ajudar.

Eu tive alguns problemas devido a essa característica do setSelectedItem. Eu não achei nenhuma solução pronta na classe JComboBox mas conseguir resolver o problema. A solução foi criar uma classe que herda de ComboBoxModel ( vamos chamar de myComboBoxModel). Nessa classe eu implemento um novo método setSelectedItem (polimorfismo). Esse método eu implemento de forma a selecionar o objeto desejado e não subtituir pelo objeto passado como parâmetro.

Exemplo de um código setSelectedItem
Digamos que o objeto que estou inserindo na lista têm as propriedades Descricao e Codigo (TItemComboBox).
o método toString() retorna Descricao e o método equal() compara o valor do Codigo.

public void setSelectedItem(Object Value)
{
    Object o = null;
    for (int i = 0; i < this.getSize(); i++)
   {
        if (((TItemComboBox)Value).getCodigo() == ((TItemComboBox)this.getElementAt(i)).getCodigo())
        {
            o = getElementAt(i);
        }
    }
    super.setSelectedItem(o);
}

Não esqueça de aplicar o modelo ao jComboBox antes
Exemplo:
ComboBoxModelAsp Modelo = new myComboBoxModel();
myComboBox1.setModel(Modelo);

[quote=“Nilon”]Eu tive alguns problemas devido a essa característica do setSelectedItem. Eu não achei nenhuma solução pronta na classe JComboBox mas conseguir resolver o problema. A solução foi criar uma classe que herda de ComboBoxModel ( vamos chamar de myComboBoxModel). Nessa classe eu implemento um novo método setSelectedItem (polimorfismo). Esse método eu implemento de forma a selecionar o objeto desejado e não subtituir pelo objeto passado como parâmetro.
[/quote]

Eu jah achei a solucao faz um tempinho mais eh sempre bom saber q alguem tem uma outra forma de fazer…veja o q eu fiz:

Eu fiz uma coisa parecida…extendi o JComboBox e sobreescrevi o metodo ‘setSelectedItem(Object o)’.

public void setSelectedItem(Object selecao) {
if (selecao != null) {
if( passou == true ) {
super.setSelectedItem(selecao);
this.passou = false;
}
else {
int index = this.getItemPosicao( selecao);
if( index != -1 ) {
this.passou = true;
super.setSelectedIndex( index);
}
}
}
}

O atributo ‘passou’ determina se jah foi calculado a posicao do elemento no combo, o index, se jah foi, ai eu seto o elemento selecionado pelo indice. Faco isso pq o setSelectedIndex( index) tb utiliza chama o setSelectedItem(Object) (de uma forma quase recursiva)!

Tah meio confuso mais funcionou…o problema da sua solucao eh q nao serve pra qualquer objeto, tem que ser um Objeto q implemente TItemComboBox, nao eh?

não rola fazer assim??

cbox.setSelectedItem(cbox.getModel().indexOf(element));

[]s!

Galera, sei que este tópico é antigo, mas isso pode interessar a quem visitar essa página. Resolvi assim:

JcomboBox.getModel().setSelectedItem(ITEM);

Vlw

4 curtidas

Ola, já que está aberta a discussao sobre JCombobox e seu model, tambem vou entrar:
Ai galera quando se trata de combobox com objetos eu uso GenericComboBoxModel.
Ex:

GenericComboBoxModel<Objeto> cbModel  = new GenericComboBoxModel<Objeto>();
comboBox.setmodel(cbModel);

Sabendo que não é uma classe nativa do java, segue o codigo:

public class GenericComboBoxModel<T> extends DefaultComboBoxModel {

	private static final long serialVersionUID = 3163209468787065554L;

	private List<T> data;
	private T nullObj;

	public GenericComboBoxModel(List<T> list) {
		super(list.toArray());
		data = list;
	}
	
	public GenericComboBoxModel(List<T> list, T nullObj) {
		super(list.toArray());
		this.nullObj = nullObj;
		data = new ArrayList<T>();
		insertElementAt(nullObj, 0);
		data.add(nullObj);
		data.addAll(list);
		setSelectedObject(null);
	}
	
	public GenericComboBoxModel() {
		data = new ArrayList<T>();
	}

	public void addObject(T obj) {
		addElement(obj);
		data.add(obj);
		setSelectedObject(obj);
	}

	public void removeObject(T obj) {
		removeElement(obj);
		data.remove(obj);
	}

	public void setData(List<T> list) {
		removeAllElements();
		data.clear();
		if (nullObj != null) {
			data = new ArrayList<T>();
			data.add(nullObj);
			data.addAll(list);
		}else {
			data = list;
		}
		for (T obj : data) {
			addElement(obj);
		}
	}

	public List<T> getData() {
		return data;
	}

	public void setSelectedObject(T obj) {
		if (obj == null) {
			setSelectedItem(nullObj);
		}else{
			setSelectedItem(obj);
		}
	}

	@SuppressWarnings("unchecked")
	public T getSelectedObject() {
		return (T)getSelectedItem();
	}
	
	public void setNullObject(T obj) {
		nullObj = obj;
		if (!data.isEmpty()) {
			data.add(0, nullObj);
		}
	}
	
	public void clear() {
		data.clear();
		removeAllElements();
		if (nullObj != null)
			data.add(nullObj);
		setSelectedObject(null);
	}

}

Espero ter ajudado. flw

Parceiro será q vc pode me da uma ajudinha a utilizar JCombobox, já estou quase desistindo de utilizar o mesmo.

[quote=R$chieck]Ola, já que está aberta a discussao sobre JCombobox e seu model, tambem vou entrar:
Ai galera quando se trata de combobox com objetos eu uso GenericComboBoxModel.
Ex:

GenericComboBoxModel<Objeto> cbModel  = new GenericComboBoxModel<Objeto>();
comboBox.setmodel(cbModel);

[/quote]

R$chieck bom dia ver se vc pode me ajuda ate consegui povoa o JCombobox com sua classe abaixo esta o código com fiz para realizar essa ação agora como eu faço para seta o nome no JCombobox referente ao obj q vem do banco tipo assim eu recupero o obj cujo o id é 23 que se refere ao RECARGA ON LINE.
Agora o JCombobox é carregado com obj PlanoContaModel e o id q eu recupero do banco é do tipo de obj ConfigSystem.

private void comboRecarga() { comboRecarga.setModel(cbModel); listaPlanoConta = new PlanoContaController().planoConta("C", "%"); cbModel.setData(listaPlanoConta); }

Para quem interessar possa, uma maneira possivel de se resolver tambem esse problema é implemantar a função equals na classe basica do objeto que vc esta usando no combo, assim como se deve fazer com o toString é só implementar isso:

public boolean equals(Object obj) {
		if(obj instanceof SEUOBJETO) {
			SEUOBJETO o = (SEUOBJETO) obj;
			return o.getId().equals(this.getId());
		}
		return false;
	}