2016-07-27 35 views
0

Ich erstelle einen Rahmen, der 3 Combobox enthält, die jeweils abhängig von der anderen, die dritte abhängig von der 2. und die 2. abhängig von 1 ist. Das Problem ist, wenn ich das erste ändere, bekomme ich NullPointer-Ausnahme auf dem 3. weil es Aktionen die Änderungsaktion für das 2. ist.jCombobox NullPointer Ausnahme

Meine Frage ist, wie die Aktion der Elementänderung auf der 3. jComboBox "jCombobox2" zu verhindern, wenn ich die 1. jComboBox "jComboBox0" ändern?

Hier ist mein Code:

private void jComboBox0ItemItemStateChanged(ItemEvent event) { 
    jComboBox1.removeAllItems(); 
    ComboItem cat = (ComboItem) jComboBox0.getSelectedItem(); 


    String requete = "from Subcategory where Fk_Category = " + cat.getValue(); 

    Collection subcategories = Subcategory.getListeSubcategory(requete); 

    for (Iterator i = subcategories.iterator(); i.hasNext();) { 
     Subcategory item = new Subcategory(); 
     item = (Subcategory) i.next(); 
     System.out.println(item.getId()); 

     jComboBox1.addItem(new ComboItem(item.getNom(), (int) item.getId())); 
    } 

    // System.out.println("tbdlat a lkhra ! : "+listCategory.get(0)); 

} 

private void jComboBox1ItemItemStateChanged(ItemEvent event) { 
    // nda2 
    jComboBox2.removeAllItems(); 
    ComboItem cat = (ComboItem) jComboBox1.getSelectedItem(); 


    String requete = "from Area where fk_Subcategory = " + cat.getValue()+" group by Nom_Area"; 

    Collection areas = Area.getListeArea(requete); 

    for (Iterator i = areas.iterator(); i.hasNext();) { 
     Area item = new Area(); 
     item = (Area) i.next(); 
     System.out.println(item.getId()); 

     jComboBox2.addItem(new ComboItem(item.getNom(), (int) item.getId())); 
    } 

} 

private void jComboBox2ItemItemStateChanged(ItemEvent event) { 
    // i'll do some code here 
} 
+5

1) Siehe [Was ist ein Stack-Trace ist, und wie kann ich es verwenden, um meine Fehler in der Anwendung zu debuggen ?] (http://stackoverflow.com/q/3988788/418556) & [Was ist eine Nullzeigerausnahme und wie behebe ich sie?] (http://stackoverflow.com/q/218384/418556) 2) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. –

+0

@AndrewThompson meine Frage ist, wie die Aktion der Elementänderung auf der 3. jComboBox "jCombobox2" zu verhindern, wenn ich die 1. jComboBox "jComboBox0" ändern? – Lizinh

+1

OK .. guten Ruf für die Bearbeitung in die Frage. Hast du das Problem mit Hilfe meines ersten Kommentars gelöst? Wenn nicht, wie wird der MCVE, wie in meinem 2. Kommentar erwähnt, gehen? –

Antwort

0

Das Problem mit Ihrem Code scheint zu sein, dass Sie nicht überprüfen, ob ein Element ausgewählt ist. Sie sollten in Ihrem Listener überprüfen, ob ein Element ausgewählt ist. Wenn Sie das nicht überprüfen, wird die itemStateChange-Methode zweimal aufgerufen.

poste ich unter einem Code, die drei Combo-Boxen und einen einzigen Zuhörer für alle drei Kombinationen:

import java.awt.FlowLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 

public class MainWindow1 extends JFrame implements ItemListener { 

    public MainWindow1() { 

     String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 

     //Create the combo box, select item at index 4. 
     //Indices start at 0, so 4 specifies the pig. 

     setLayout(new FlowLayout()); 

     JComboBox petList1 = new JComboBox(petStrings); 
     //petList1.setSelectedIndex(4); 
     petList1.addItemListener(this); 
     petList1.setName("petList1"); 

     JComboBox petList2 = new JComboBox(petStrings); 
     petList2.setSelectedIndex(4); 
     petList2.addItemListener(this); 
     petList2.setName("petList2"); 

     JComboBox petList3 = new JComboBox(petStrings); 
     petList3.setSelectedIndex(4); 
     petList3.addItemListener(this); 
     petList3.setName("petList3"); 

     getContentPane().add(petList1); 
     getContentPane().add(petList2); 
     getContentPane().add(petList3); 


     setSize(800, 600); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new MainWindow1(); 

    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if (e != null && e.getSource().toString() != null && e.getSource().toString().contains("petList1") && e.getStateChange() == ItemEvent.SELECTED) { 

      System.out.println("1" + e.getSource()); 
     } else if (e != null && e.getSource().toString() != null && e.getSource().toString().contains("petList2") && e.getStateChange() == ItemEvent.SELECTED) { 
      System.out.println("2" + e.getSource()); 
     } else if (e != null && e.getSource().toString() != null && e.getSource().toString().contains("petList3") && e.getStateChange() == ItemEvent.SELECTED) { 

      System.out.println("3" + e.getSource()); 
     } 

    } 

} 
+1

genau habe ich es heute morgen gelöst, indem ich überprüft habe, ob die jcombobox leer ist oder nicht – Lizinh