2011-11-25 64 views
1

NetBeans。使用IDE創建的UI。 我的實現在外觀上的順序:從JList中移除項拋出NullPointerException

1全局形式變量:

private DefaultListModel model; 

2構造:

ArrayList<String> cameras = repository.getCameraNames(); 

model= new DefaultListModel(); 
for (int i = 0; i < cameras.size(); i++) { 
    model.addElement(cameras.get(i)); 
} 
thelist.setModel(model); 

3刪除按鈕:

private void btnRemoverActionPerformed(java.awt.event.ActionEvent evt) {           
    int index = thelist.getSelectedIndex(); 

    model.removeElementAt(index); 
} 

在removeElementAt線,我得到NullPointerException。如果我更改索引的顯式數字,它可以工作,但不會與索引變量。但選定的索引不起作用!

任何人都可以幫忙嗎?

哦,這裏是一些stackttrace:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at FrmPrincipal.thelistValueChanged(FrmPrincipal.java:217) 
at FrmPrincipal.access$000(FrmPrincipal.java:22) 
at FrmPrincipal$1.valueChanged(FrmPrincipal.java:77) 
at javax.swing.JList.fireSelectionValueChanged(JList.java:1798) 
at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211) 
at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:677) 
at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(BasicListUI.java:2601) 
at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179) 
at javax.swing.DefaultListModel.removeElementAt(DefaultListModel.java:332) 

UPDATE

我固定,通過改變下面的方法:

private void thelistValueChanged(javax.swing.event.ListSelectionEvent evt) { 
    txtCameraName.setText(thelist.getSelectedValue().toString()); 
} 

private void thelistValueChanged(javax.swing.event.ListSelectionEvent evt) { 
    txtCameraName.setText((String)thelist.getSelectedValue()); 
} 

但我不知道爲什麼! 有人可以解釋爲什麼它不接受toString()並接受鑄造?

+0

這不是一個NPE出來的'JList'的,但是從列表中選擇偵聽器。你看過'FrmPrincipal'嗎?此外,您還需要在調用removeElementAt()之前檢查getSelectedIndex()是否不返回「-1」(表示沒有選中任何內容)。另外,在'removeElementAt(int)'javadoc中聲明,您應該更喜歡'remove(int)'。 –

+0

對不起,不知道NPE是什麼意思。 「列表」是我給IDE設計的JList的名稱。 getSelectedIndex()返回正確的索引。這真的很奇怪。 – programad

+0

NPE ='NullPointerException'。 NPE來自列表選擇監聽器FrmPrincipal.java:217' - 從那裏開始。 –

回答

8

因爲getSelectedValue().toString()會拋出一個NPE,如果沒有選擇,您的更改「固定」您的問題,而(String)getSelectedValue()將評估爲null如果沒有選擇。但是,如果您將列表中的內容不是String s,那麼當您嘗試將選定值轉換爲String時,則會得到ClassCastException。所以,這可能已經解決了你目前的問題,但這不是真正的解決方案。

我只是這樣做:

private void theListValueChanged(ListSelectionEvent e) { 
    final Object selectedValue = theList.getSelectedValue(); 
    if (selectedValue != null) { 
     txtCameraName.setText(selectedValue.toString()); 
    } else { 
     // Clear the text since there's no selection 
     txtCameraName.setText(null); 
    } 
} 
相關問題