2011-11-30 4 views
1

JComboBox의 값을 ActionListener에서 변경하려고하고 있으며 행운이 없습니다.Java의 JComboBox 값을 변경하십시오.

변경된 경우 CardLayout (다른 GUI로 전환됨)이있는 JComboBox가 있습니다.

사용자를위한 옵션이있는 메뉴 표시 줄이 있는데, 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 필드는 다른 인스턴스의 동일한 필드가 여전히 null 인 동안 설정됩니다. 왜이 수업의 두 인스턴스를 설정하는지 모르겠지만 문제를 발견 할 수 있을지 의심 스럽습니다.

행운을 빈다.

+0

그게 문제였습니다 ... 나는 그 다른 인스턴스를 완전히 놓쳤습니다. 감사! 나는 그것들을 싫어한다. :) :) 그 (것)들을 놓치기를 위해 좀 어리 석을 느낀다 ... LOL – W3BGUY

1

하는 경우 다음

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

중 하나 thisAction : 내가 생각으로, 당신의 NPE이 두 라인 중 하나에서 발생되고있다 null이거나 cb이 null입니다. 체크 아웃 한 다음 다시 돌아와 업데이트하십시오. 행운을 빕니다!

0

@ 콜비 맞습니다. 생성 한 두 번째 인스턴스 인 setGUI에는 생성 된 cb 개체가 없습니다. addComponentToPane()을 호출하여 다른 패널을 만들고 카드에 추가하려는 경우 다음과 같이 간단하게 호출 할 수 있으며 객체를 만들 필요가 없습니다.

addComponentToPane (frame.getContentPane());

+0

예, 그게 문제였습니다 ... 어리석은 실수 ... 롤 ... 고마워요! – W3BGUY