Bug - JComboBox seleciona o item errado!

3 respostas
muriloazs

Olá,

Tive um problema com um ComboBox. Eis o problema:

Quando insiro um dois elementos com o mesmo nome(espaços já diferenciam o item e não ocorre problema):

Items do combobox:

Item 1 – Mesmo que o segundo seja o selecionado, o primeiro será o que eu conseguirei pegar no getSelectedItem()
Item 1
Item 2

Não tenho código pra postar por que não houve programação alguma.

Garimpei muito no Google e acabei encontrando isso:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4133743

O problema existe desde 1998 e segundo o último post não foi corrigido.

Alguém tem ideia?

Obrigado!

3 Respostas

E

Uma forma de não deixar isso ocorrer é não inserir diretamente Strings em uma JComboBox. O correto é inserir objetos (de uma classe bem simplesinha que implemente o método public String toString() de forma que mostre o que você quer ver no ComboBox). Aí getSelectedItem (não getSelectedIndex) retorna para você o objeto adequado. Por exemplo, você pode ter um objeto da classe Estado, como abaixo, e inserir esses objetos no seu JComboBox. Por exemplo, new Estado (“SP”, “São Paulo”). Então, o JComboBox vai mostrar “SP”, “RJ” etc. (as siglas). Quando você precisar do nome, você faz um cast do getSelectedItem para Estado, e pega o nome.

public class Estado {
    public String sigla;
    public String nome;
    public Estado (String s, String n) { sigla = s; nome = n; }
    public String toString() { return sigla; }
}
M

muriloazs O problema no código que está nesse link é que o autor está utilizando String. Duas Strings “a” e “a” são consideradas referências iguais, pois as referências apontam para o mesmo objeto no pool de Strings. Se você fizer o mesmo código utilizando objetos que são mostrados no JComboBox como tendo descrições iguais, mas que na verdade são considerados objetos diferentes, esse problema não ocorre. Tente com o código abaixo(uma adaptação do que está no link).

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxBug extends JFrame{
	public static void
    main(String args[])
    {
		ComboBoxBug frame = new ComboBoxBug("title");
    }

    public
    ComboBoxBug(String title)
    {
        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComboBox box = new JComboBox();
        getContentPane().add(box);
        setBounds(300,200,100,150);
        setVisible(true);

        Item item1 = new Item(1, "a");
        Item item2 = new Item(2, "a");
        box.addItem(item1);
        box.addItem(item2);
        box.setSelectedIndex(1);
        System.out.println(box.getSelectedIndex());
    }

}

class Item{
	private int id;
	private String description;

	Item(int id, String description){
		this.id = id;
		this.description = description;
	}
	
	public boolean equals(Object o){
		Item item = (Item)o;
		if(this.getId() == item.getId()){
			return true;
		}else{
			return false;
		}
	}

	public int hashCode(){
		return this.getId() * 17;
	}
	
	public String toString(){
		return this.getDescription();
	}
	
	public int getId() {
		return id;
	}
	public String getDescription() {
		return description;
	}
}
M

Complementando o post acima, se você cria os dois objetos com "id"s diferentes, porém com "description"s iguais:

Item item1 = new Item(1, "a");
Item item2 = new Item(2, "a");

o método equals retorna false e a saída é 1.

Se você cria os dois objetos com "id"s iguais:

Item item1 = new Item(1, "a");
Item item2 = new Item(1, "a");

o método equals retorna true e a saída é 0.

Criado 17 de setembro de 2010
Ultima resposta 17 de set. de 2010
Respostas 3
Participantes 3