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?
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?
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);
}
}
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);
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.
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;
}