2013-12-13 52 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