2011-11-30 199 views
1

我试图从ActionListener更改JComboBox的值,但没有运气。在Java中更改JComboBox的值

我有一个JComboBox,当改变CardLayout(切换到另一个GUI)。

我有一个带有用户选项的菜单栏,我想自动更改JComboBox selectedItem。从本质上讲,我最终的愿望是将它放在菜单栏可以更改CardLayout的位置(但我无法用我的ActionListener更改卡片布局)。

它看起来像代码无法从内部侦听器类中找到JComboBox。

任何帮助,包括引用我去阅读,将不胜感激。

这里是我当前的代码(仍然非常开发中):

package inventorytrackingsystem; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.rmi.*; 

public class InventoryTrackingSystem implements ItemListener { 
    JPanel mainPanel; 
    JFrame frame; 

    JPanel cards; //a panel that uses CardLayout 
    final static String MAINPANEL = "Main"; 
    final static String CHECKITEMSPANEL = "Check Items"; 
    final static String NEWITEMPANEL = "New Item"; 
    final static String CHECKOUTITEMPANEL = "Check Out Item"; 
    final static String ITEMINFOPANEL = "Item Information"; 
    JPanel comboBoxPane; 
    private JComboBox cb; 
    static String comboBoxItems[] = {MAINPANEL,CHECKITEMSPANEL,NEWITEMPANEL,CHECKOUTITEMPANEL,ITEMINFOPANEL}; 

    public static void main(String[] args) { 
    final InventoryTrackingSystem ITS = new InventoryTrackingSystem(); 
    /* Use an appropriate Look and Feel */ 
    try { 
     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    /* Turn off metal's use of bold fonts */ 
    UIManager.put("swing.boldMetal", Boolean.FALSE); 

    //Schedule a job for the event dispatch thread: 
    //creating and showing this application's GUI. 
// javax.swing.SwingUtilities.invokeLater(new Runnable() { 
//  public void run() { 
     ITS.createAndShowGUI(); 
//  } 
// }); 

    } 

    public void addComponentToPane(Container pane) { 
    //Put the JComboBox in a JPanel to get a nicer look. 
    comboBoxPane = new JPanel(); //use FlowLayout 
    cb = new JComboBox(comboBoxItems); 
    cb.setEditable(false); 
    cb.addItemListener(this); 
    comboBoxPane.add(cb); 

    //Create the "cards". 
    JPanel main = new guiBuilder().buildGui("main"); 
    JPanel checkItems = new guiBuilder().buildGui("checkItems"); 
    JPanel newItems = new guiBuilder().buildGui("newItems"); 
    JPanel checkOutItems = new guiBuilder().buildGui("checkOutItems"); 
    JPanel itemInfo = new guiBuilder().buildGui("itemInfo"); 

    //Create the panel that contains the "cards". 
    cards = new JPanel(new CardLayout()); 
    cards.add(main, MAINPANEL); 
    cards.add(checkItems, CHECKITEMSPANEL); 
    cards.add(newItems, NEWITEMPANEL); 
    cards.add(checkOutItems, CHECKOUTITEMPANEL); 
    cards.add(itemInfo, ITEMINFOPANEL); 

    pane.add(comboBoxPane, BorderLayout.PAGE_START); 
    pane.add(cards, BorderLayout.CENTER); 
    } 

    public void itemStateChanged(ItemEvent evt) { 
    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.show(cards, (String)evt.getItem()); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event dispatch thread. 
    */ 
    private void createAndShowGUI() { 
     //Create and set up the window. 
     frame = new JFrame("Inventory Tracking System"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setLayout(new BorderLayout()); 
     Menu m1 = new Menu("Options"); 

     MenuItem mi1_0 = new MenuItem("Main Page"); 
     mi1_0.setActionCommand("main"); 
     mi1_0.addActionListener(new menuListener()); 

     MenuItem mi1_1 = new MenuItem("Check Item"); 
     mi1_1.setActionCommand("checkItem"); 
     mi1_1.addActionListener(new menuListener()); 
     MenuItem mi1_2 = new MenuItem("Add New Item"); 
     mi1_2.setActionCommand("addItem"); 
     mi1_2.addActionListener(new menuListener()); 
     MenuItem mi1_3 = new MenuItem("List All Items"); 
     mi1_3.setActionCommand("listAllItems"); 
     mi1_3.addActionListener(new menuListener()); 
     MenuItem mi1_4 = new MenuItem("Exit"); 
     mi1_4.setActionCommand("exit"); 
     mi1_4.addActionListener(new menuListener()); 

     Menu m2 = new Menu("Help"); 
     MenuItem mi2_0 = new MenuItem("About"); 
     mi2_0.setActionCommand("about"); 
     mi2_0.addActionListener(new menuListener()); 

     m1.add(mi1_0); 
     m1.add(mi1_1); 
     m1.add(mi1_2); 
     m1.add(mi1_3); 
     m1.add(mi1_4); 

     m2.add(mi2_0); 

     MenuBar mb = new MenuBar(); 
     frame.setMenuBar(mb); 
     mb.add(m1); 
     mb.add(m2); 

     //Create and set up the content pane. 
     InventoryTrackingSystem setGUI = new InventoryTrackingSystem(); 
     setGUI.addComponentToPane(frame.getContentPane()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 

     frame.setSize(500, 500); 
     frame.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent we){ 
      System.exit(0); 
     } 
     public void windowClosed(WindowEvent we){ 
      System.exit(0); 
     } 
     }); 

    } 

    class menuListener implements ActionListener{ 
     public void actionPerformed(ActionEvent ev){ 
     String thisAction=ev.getActionCommand(); 

     if(thisAction.equals("main")){ 
      cb.setSelectedItem(MAINPANEL); 
     }else if(thisAction.equals("checkItem")){ 
      //change GUI 
     }else if(thisAction.equals("addItem")){ 
      //change GUI 
     }else if(thisAction.equals("listAllItems")){ 
      //change GUI 
     }else if(thisAction.equals("exit")){ 
      System.exit(0); 
     }else if(thisAction.equals("about")){ 
      JOptionPane.showMessageDialog(frame, "About This App"); 
     } 
     } 
    } 
} 

,当我尝试使用的菜单,我得到的错误如下:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at inventorytrackingsystem.InventoryTrackingSystem$menuListener.actionPerformed(InventoryTrackingSystem.java:161) 
    at java.awt.MenuItem.processActionEvent(MenuItem.java:627) 
    at java.awt.MenuItem.processEvent(MenuItem.java:586) 
    at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:337) 
    at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:325) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646) 
    at java.awt.EventQueue.access$000(EventQueue.java:84) 
    at java.awt.EventQueue$1.run(EventQueue.java:602) 
    at java.awt.EventQueue$1.run(EventQueue.java:600) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:616) 
    at java.awt.EventQueue$2.run(EventQueue.java:614) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
BUILD SUCCESSFUL (total time: 6 seconds) 
+2

请在代码中标记错误正在抛出的位置......我们没有行号...... – BenCole

回答

3

根问题似乎与您实例化InventoryTrackingSystem的两个实例有关。一个实例中的cb字段被设置,而另一个实例中的相同字段仍然为空。我不确定你为什么要设置这个类的两个实例,但我怀疑如果你检查你会发现你的问题。

祝你好运。

+0

这就是问题......我完全错过了其他实例。谢谢!我讨厌这个问题...... :)让你觉得有点愚蠢因为想念他们...... lol – W3BGUY

1

如果,因为我怀疑,你的NPE正在从这两行之一抛出:

if(thisAction.equals("main")){   
    cb.setSelectedItem(MAINPANEL); 

然后要么thisAction为空,或cb为空。检查出来,然后回来并更新。祝你好运!

0

@colby是正确的。您创建的第二个实例setGUI没有创建cb对象。如果你的意图是调用addComponentToPane()来构造不同的面板并添加到卡,那么你可以简单地调用如下,并且不需要创建对象

addComponentToPane(frame.getContentPane());

+0

是的,那就是问题......愚蠢的错误......大声笑......谢谢! – W3BGUY