JComboBox Item Listener Selected Item

Dando18 picture Dando18 · Nov 8, 2013 · Viewed 12.3k times · Source

I am creating a combo box and it keeps giving me an error with the item listener that I don't understand. If you could also explain your answer that would be nice. Thanks in advance:

Here's the item listeners for the combo boxes:

combo1.addItemListener(new ItemListener(){
            @Override
            public void itemStateChanged(ItemEvent e){
               if(e.getStateChange() == ItemEvent.SELECTED){
                  JComboBox localCombo = (JComboBox)e.getSource();
                  ic1[0] = localCombo.getSelectedItem().toString();     
               }  
            }
        });
        combo2.addItemListener(new ItemListener(){
            @Override
            public void itemStateChanged(ItemEvent e){

                if(e.getStateChange() == ItemEvent.SELECTED){
                    JComboBox localCombo = (JComboBox)e.getSource();
                    ic1[1] = localCombo.getSelectedItem().toString();
                }
            }
        });

The error says it is on the .getSelectedItem()... lines. It only gives me the error when I run the program and select a word in the box. Thanks!

Here's the error in the run (line 61 is the .getSelectedItem()... line):

    run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at thisprogramisforfun.guiClasses.guiClassConversions$1.itemStateChanged(guiClassConversions.java:61)
    at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1225)
    at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1282)
    at javax.swing.JComboBox.contentsChanged(JComboBox.java:1329)
    at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
    at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93)
    at javax.swing.JComboBox.setSelectedItem(JComboBox.java:578)
    at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:624)
    at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:835)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:499)
    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:4492)
    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:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    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:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Answer

Hovercraft Full Of Eels picture Hovercraft Full Of Eels · Nov 8, 2013

Your problem is here:

combo1 = (JComboBox)e.getSource();
ic1[0] = combo2.getSelectedItem().toString();

You're getting combo1 but calling a method on combo2

Better would be this:

combo1 = (JComboBox)e.getSource();
ic1[0] = combo1.getSelectedItem().toString();

But even better, use a local variable for this sort of work, not a field.

JComboBox localCombo = (JComboBox)e.getSource();
ic1[0] = localCombo.getSelectedItem().toString();