2013-12-13 50 views
0

我有使用附带的侦听器模型来捕捉所选项目的组合框:爪哇 - 清爽的JComboBox抛出异常

deleteCombo = new JComboBox<Course>(course.toArray(new Course[course.size()])); 
model = new DefaultComboBoxModel<Course>(course.toArray(new Course[course.size()])); 
deleteCombo.setModel(model); 
deleteCombo.setRenderer(renderer); 
deleteCombo.setSelectedIndex(0); 
deleteCombo.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) 
    { 
     JComboBox deleteCombo = (JComboBox)e.getSource(); 
     Course course = (Course)deleteCombo.getSelectedItem(); 
     deleteNumTxt.setText(course.getCourseNum()); //This is line 391 
     deleteTitleTxt.setText(course.getCourseTitle()); 
     deleteDurationTxt.setText(String.valueOf(course.getDuration())); 
     deleteFeeTxt.setText("$" + String.valueOf(course.getCourseFee())); 
     deleteLevelTxt.setText(course.getCourseLevel()); 
    } 
}); 

我使用itemSelected事件来填充文本框在GUI中显示详细信息选择的课程。当选择课程,删除课程按钮被点击它进入这个方法:

public static void deleteCourseRecord() { 
courseNumIn = deleteNumTxt.getText(); 
int index = course.indexOf(new Course(courseNumIn)); 
course.remove(index); 

//RE-POPULATE EDIT AND DELETE COMBOBOXES 
model.removeAllElements(); 
for(Course item : course) { 
    model.addElement(item); 
    } 
} 

记录被删除,但它引发此异常:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at MyCourse$2.actionPerformed(MyCourse.java:391) 
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260) 
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1331) 
at javax.swing.JComboBox.intervalRemoved(JComboBox.java:1351) 
at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179) 
at javax.swing.DefaultComboBoxModel.removeAllElements(DefaultComboBoxModel.java:175) 
at MyCourse$Course.deleteCourseRecord(MyCourse.java:1138) 
at MyCourse.actionPerformed(MyCourse.java:883) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
tjavax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 

,我认为是有问题的我已经建立了actionPerformed部分,但我不知道它是什么。如果我不用模型(或任何其他方法)刷新组合框,它不会抛出异常。如果我注释掉第391行(在代码中标记),它将抛出第392行的异常,依此类推。如果填充文本字段的所有代码行都被注释掉,它不会引发异常,但是当然,该函数会丢失。关于我在做什么的任何想法都是错误的?干杯

+0

哪一行是行391 – 75inchpianist

+0

deleteNumTxt.setText(course.getCourseNum()); //这是391行 – Spud

+0

然后deleteNumTxt或当然没有实例化。 deleteNumTxt在哪里设置?从你发布的代码看起来它是空的 – 75inchpianist

回答

2

的问题如下:

每次你改变设置为组合框的动作监听器被调用模型。

所以,当你这样做:

//RE-POPULATE EDIT AND DELETE COMBOBOXES 
model.removeAllElements(); 

时,执行的ActionListener和

Course course = (Course)deleteCombo.getSelectedItem(); 

是空的,因为你只是删除了您组合框的所有元素。

你可以看到这一点,如果你试试这个简单的例子:

public static void main(String[] args) 
    String [] s = {"1", "2"}; 
    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(s); 
    JComboBox<String> j = new JComboBox<String>(s); 
    j.setModel(model); 

    j.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println(((JComboBox) arg0.getSource()).getSelectedItem());    
     } 
    }); 

    JFrame jf = new JFrame(); 
    jf.add(j); 
    jf.setVisible(true); 
    jf.setSize(100, 100); 

    model.removeAllElements(); 
} 

它将输出null

+0

我试过你的例子,你是对的,现在你已经解释了它。我认为for循环会照顾它,因为它重建了组合框,不是吗?有没有解决这个问题的方法?谢谢 – Spud

+0

在对模型执行操作之前,您可以将布尔类属性'removed'设置为true。在actionlistener中,您将检查'removed',如果'removed'为false,则只执行侦听器代码。 – Blub

+0

干得好,伙计!奇迹般有效。感谢您的时间。干杯 – Spud