JComboBox getSelectedIndex() -1

Pessoal,

Tenho um problema com meu comboBox. Tenho 3 classes:

Funcionando:

public class Moeda {
    
    private String moeda;
    private int id;
    
    public Moeda(int id, String moeda){
        this(moeda);
        this.id = id;
    }
    
    public Moeda(String moeda){
        this.moeda = moeda;
    }
    
    public int getID(){
        return id;
    }
    
    public void setID(int id){
        this.id = id;
    }
    
    public String getMoeda(){
        return moeda;
    }
    
    public void setMoeda(String moeda){
        this.moeda = moeda;
    }
    
   public String toString(){
	String moeda = this.moeda;
	
	return moeda;
    }
	
    public boolean equals(Object o){
        if (o instanceof Moeda){
            Moeda cia = (Moeda) o;
            
            if (cia.getMoeda().equals(this.moeda)){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    } 
}

Funcionando:


import dao.MoedaDAO;
import java.util.List;
import javax.swing.JComboBox;

public class ComboMoeda extends JComboBox{   
    public void carregarMoeda(){
        MoedaDAO moeda = new MoedaDAO();
        List lista = moeda.listaMoeda();
	this.removeAllItems();
		
	for(int i = 0; i < lista.size(); i++){
            this.addItem(lista.get(i));
	}      
	setMaximumRowCount(5);
    }
}

Meu problema começa aqui:

ComboMoeda comboMoeda = new ComboMoeda();
comboMoeda.carregarMoeda(); //chamada para popular o combo - OK
comboMoeda.setEditable(false); // OK
comboMoeda.getModel().setSelectedItem("RS"); // Funciona, a interface acata esse set.

Moeda moeda = (Moeda) comboMoeda.getSelectedItem(); //acusa erro e pára a execução.
int id = moeda.getID();

Então gera esse Exception:


Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to base.Moeda
	at crassus.Index$7.mouseClicked(Index.java:1408)
	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
	at java.awt.Component.processMouseEvent(Component.java:6508)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:682)
	at java.awt.EventQueue$3.run(EventQueue.java:680)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:696)
	at java.awt.EventQueue$4.run(EventQueue.java:694)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Resumo da ópera… Quando eu faço um setSelectedItem a interface acata perfeitamente. Mas, quando chamo o método getID() da classe Moeda, ele dá esse erro. Fiz um teste, e chamei o getSelectedIndex(), o resultado foi -1

Há alguma forma de dar um setSelectedItem sem dar esse erro? No caso, não me adiantaria o setSelectedIndex().

Desde já Obrigado.

P.S.: Minha classe MoedaDAO está OK,não coloquei aqui pois creio que não seria necessário.

Vc viu que na linha

Moeda moeda = (Moeda) comboMoeda.getSelectedItem();

vc está pegando um ITEM do combo, no caso vc vai capturar por exemplo o “RS” que foi atribuído anteriormente, como você mesmo citou, dessa maneira vc está tentando fazer um CAST passando o “RS” para um objeto MOEDA.

Não sei se é exatamente isso, mas creio que vale a pena tentar.
Qualquer coisa posta ai.

Vc viu que na linha

Moeda moeda = (Moeda) comboMoeda.getSelectedItem();

vc está pegando um ITEM do combo, no caso vc vai capturar por exemplo o “RS” que foi atribuído anteriormente, como você mesmo citou, dessa maneira vc está tentando fazer um CAST passando o “RS” para um objeto MOEDA.

Não sei se é exatamente isso, mas creio que vale a pena tentar.
Qualquer coisa posta ai.

Olá Chibana, obrigado pela atenção.

Ainda não consegui achar o erro. Tudo começa quando eu faço um setSelectedItem. Se eu não fizer o set, o programa funciona, tanto que o Cast para Moeda funciona, e o getID retorna o valor correto.

O que me causou confusão, é que tenho a impressão que o setSelected está “modificando” meu JCombo, tanto que o getSelectedIndex retorna -1.

Explicando o motivo do setSelectedItem:

Há N moedas que serão populadas e que estarão disponiveis para o User mexer se quiser. Porém, o combo deve estar selecionado com a moeda que já vem do select, isso fuinciona, mas, o setSeletected está “quebrando”.

Olá Boa Tarde!

Se eu não me engano, -1 é o primeiro item do comboBox que deveria ser “Selecione”…alguma coisa do tipo…
então se você tentar converter “Selecione” para Moeda, vai dar Exception.
Outra coisa, se você debugar bem nessa hora (SetSelectItem) olha o tipo de objeto que está na lista do combo…

Pessoal,

Sobre essa questão, ainda não consegui resolver. Mas… Vou usar este recurso que funcionou e atendeu o que precisava. Segue o códido como referência, caso alguém se interesse. Assim, não sei se é a melhor prática de programação, mas…

           for(int i = 0; i < comboMoeda.getItemCount(); i++){
                String moeda = dialog.getMoeda(); // Uma String recebendo um return vindo de um método de outra Classe (Dialog), por exemplo "R$"
                if(moeda.equals(comboMoeda.getItemAt(i).toString())){
                    comboMoeda.setSelectedIndex(i);
                }
            }

          // Então faço o meu getID
          Moeda moeda = (Moeda) comboMoeda.getSelectedItem();
          int id = moeda.getID();
          //Sem erro e retornando o valor desejado.

Só um detalhe que pesquisei. -1 no getSelectedIndex() corresponde a um valor não pertencente ao comboBox. Explicando, quando eu fazia o setSelectedItem(“ALGUM VALOR”); e fazia o getSelectedIndex() e resultado era -1 pois “ALGUM VALOR” não correspondia a nenhum item já populado do ComboBox (por exemplo, R$, US$, EURO e etc);

Bom… Não sei se ficou claro, é que sou péssimo para explicar. Desde já eu agradeço a colaboração de todos. Para mim, essa questão está resolvida, se eu achar o X da questão quanto o setSelected, post aqui para futura referência.