2011-11-30 205 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