Erro de Cast com ComboBoxModel

3 respostas
R

Olá a todos…

Estou desenvolvendo um componente swing e estou com um pequeno problema.

Eu fiz uma classe que herda de JComboBox, uma outra classe que herda AbstractListModel e implementa ComboBoxModel.

Na classe que herda JComboBox eu estou precisando recuperar o combobox model criado por mim, porém estou com problemas para fazer tal cast. Estou fazendo da seguinte forma:

return ((LookupComboBoxModel) this.getModel()).getSelectedItem(
                columnToReturn);

Este código compila sem problema, porém quando vou utilizá-lo a seguinte exceção é gerada:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.DefaultComboBoxModel cannot be cast to br.com.datamanager.core.swing.lookup.LookupComboBoxModel
        at br.com.datamanager.core.swing.LookupComboBox.getSelectedItem(LookupComboBox.java:72)
        at javax.swing.plaf.basic.BasicComboBoxUI.configureEditor(BasicComboBoxUI.java:746)
        at com.sun.java.swing.plaf.windows.WindowsComboBoxUI.configureEditor(WindowsComboBoxUI.java:176)
        at javax.swing.plaf.basic.BasicComboBoxUI.addEditor(BasicComboBoxUI.java:695)
        at javax.swing.plaf.basic.BasicComboBoxUI$Handler.propertyChange(BasicComboBoxUI.java:1604)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:318)
        at java.awt.Component.firePropertyChange(Component.java:7885)
        at javax.swing.JComponent.firePropertyChange(JComponent.java:4420)
        at javax.swing.JComboBox.setEditable(JComboBox.java:384)
        at br.com.datamanager.security.view.SecurityTest.initComponents(SecurityTest.java:306)
        at br.com.datamanager.security.view.SecurityTest.<init>(SecurityTest.java:33)
        at br.com.datamanager.security.view.SecurityTest$6.run(SecurityTest.java:591)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Estou com uma dúvida, o método getModel retorna um ComboBoxModel certo? O model criado por mim, implementa tal interface. Então o cast feito não deveria funcionar?

Alguma sugestão de como resolver tal problema?

Desde já agradeço a ajuda.

3 Respostas

ViniGodoy

Você tem certeza que está dando um setModel() na sua combo em todos os locais que ela é criada para o seu model?

Aparentemente, o modelo default da combo continua definido lá dentro…

R

Realmente, era isto mesmo…
Já resolvi o problema.

Obrigado pela dica.

R

Fiz aqui algumas alterações para adaptar o componente às necessidades e o problema voltou.

O construtor da minha classe está da seguinte forma:

public LookupComboBox() {
        super();

        this.columnToReturn = 0;
        this.tableModel = new DefaultTableModel();

        this.setEditable(true);
        this.setModel(new LookupComboBoxModel(tableModel));
    } /* Finaliza o construtor de objetos da classe LookupComboBox. */

E o método que gera a exceção é:

public Object getSelectedItem() {
        return ((LookupComboBoxModel) this.getModel()).getSelectedItem(
                columnToReturn);
    } /* Finaliza o método getSelectedItem. */

O erro gerado é:

Exception in thread "main" java.lang.ClassCastException: javax.swing.DefaultComboBoxModel cannot be cast to br.com.datamanager.core.swing.lookup.LookupComboBoxModel
        at br.com.datamanager.core.swing.LookupComboBox.getSelectedItem(LookupComboBox.java:80)
        at javax.swing.plaf.basic.BasicComboBoxUI.configureEditor(BasicComboBoxUI.java:746)
        at com.sun.java.swing.plaf.windows.WindowsComboBoxUI.configureEditor(WindowsComboBoxUI.java:176)
        at javax.swing.plaf.basic.BasicComboBoxUI.addEditor(BasicComboBoxUI.java:695)
        at javax.swing.plaf.basic.BasicComboBoxUI$Handler.propertyChange(BasicComboBoxUI.java:1604)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:318)
        at java.awt.Component.firePropertyChange(Component.java:7885)
        at javax.swing.JComponent.firePropertyChange(JComponent.java:4420)
        at javax.swing.JComboBox.setEditable(JComboBox.java:384)
        at br.com.datamanager.core.swing.LookupComboBox.<init>(LookupComboBox.java:45)
        at br.com.datamanager.sistot.view.Application.initComponents(Application.java:65)
        at br.com.datamanager.sistot.view.Application.<init>(Application.java:37)
        at br.com.datamanager.sistot.Sistot.main(Sistot.java:50)
Java Result: 1

O que posso fazer para corrigir este cast? Se eu defino no construtor o novo model, porque ele não reconhece?

Criado 16 de fevereiro de 2007
Ultima resposta 16 de fev. de 2007
Respostas 3
Participantes 2