2016-07-27 3 views
0

Я создаю фрейм, который содержит 3 combobox, каждый из которых зависит от другого, третий зависит от второго, а второй зависит от 1-го. Проблема заключается в том, когда я меняю первый, я получаю исключение NullPointer на 3-е, потому что это действия действия изменения для второго.jCombobox NullPointer exception

Мой вопрос: как предотвратить действие изменения предмета на 3-м jComboBox «jCombobox2», когда я меняю 1-й jComboBox «jComboBox0»?

Вот мой код:

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) См [Что такое трассировка стеки, и как я могу использовать его для отладки моих ошибок приложения ?] (http://stackoverflow.com/q/3988788/418556) & [Что такое исключение Null Pointer Exception и как его исправить?] (http://stackoverflow.com/q/218384/418556) 2) Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

@AndrewThompson мой вопрос как предотвратить действие изменения элемента на 3-м jComboBox «jCombobox2», когда я меняю 1-й jComboBox «jComboBox0»? – Lizinh

+1

OK .. хороший звонок для редактирования в вопрос. Вы решили проблему с помощью моего первого комментария? Если нет, то как MCVE, как упоминалось в моем втором комментарии? –

ответ

0

Проблема с кодом, кажется, что вы не проверить, если выбран элемент. Вы должны проверить внутри своего слушателя, если выбран элемент, если вы этого не сделаете, метод itemStateChange будет вызываться дважды.

Я пост ниже коды, который имеет три поля со списком и один слушателем для всех трех комбо:

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

точно я решил это сегодня утром, проверяя, что jcombobox пуст или нет – Lizinh