2016-03-20 176 views
0

我知道這個問題已經被問過了,而且有很多線程可以剪切和粘貼工作代碼,但是我的問題是關於爲什麼我下面的代碼不起作用。我試圖從JList中刪除多個項目,但是當我運行下面的代碼時,出現了一個越界異常。這裏的的這段:從JList中刪除一個項目

static DefaultListModel<File> listModel = new DefaultListModel<>(); 
JList<File> fileList = new JList<>(listModel); 

void removeFiles() { 
    int[] listRange = new int[100]; 
    listRange = fileList.getSelectedIndices(); 
    int i = 0; 
    while (i <= listRange.length) { 
     listModel.remove(listRange[i]); 
     i++; 
    } 
} 

我使用調試語句確認fileList越來越的數據(即如果我添加4個文件的長度爲4),我也證實,在listRange指數代表我想要刪除的文件的索引。但由於某種原因,它不會刪除它們。我嘗試從fileList以及從模型(listModel)中刪除,但都不會起作用。我在這裏忽略了什麼嗎?謝謝。

+0

'有很多的線程,我可以剪切和粘貼工作代碼,但我的問題是關於爲什麼我下面的代碼不起作用 - - 那麼爲什麼你不把你的代碼與工作代碼進行比較,看看有什麼不同。如果您告訴您問題是什麼,那麼您將裁剪和粘貼工作代碼的結果會相同。那就是除非你學會對你沒有學到任何東西的問題做一些基本的調試,因爲我們已經爲你解決了這個問題。 – camickr

回答

0

的開箱即用解決方案是取消以相反的順序的項目,以避免越界異常:

int[] listRange = fileList.getSelectedIndices(); 
int i = listRange.length-1; 
while (i >= 0) { 
    listModel.remove(listRange[i]); 
    i--; 
} 
+0

是的,這是有道理的,一旦我刪除了索引改變的東西。謝謝! – user3226170

+1

如果'getSelectedIndices'沒有排序,這不起作用 –

+0

這是真的。在這種情況下,您可以複製fileList,循環複製並從原始文件中刪除。 –

2

從列表中刪除項目時,其大小會減小。

因此,例如,在3項的列表,想要在索引1和2 當您刪除第一個刪除項,列表僅剩下2索引0處的項目和1所以調用list.remove(2)會導致outOfBoundException

一個可能的解決方案是使用迭代器,並繼續調用下一個,直到您到達您想要刪除的索引之一,然後調用remove。或者簡單地減少下一個索引以刪除已執行的刪除數

PS:只有在getSelectedIndices返回有序數組時纔有效。否則,你有權責令指數自己

static DefaultListModel<File> listModel = new DefaultListModel<>(); 
JList<File> fileList = new JList<>(listModel); 

void removeFiles() { 
    int[] listRange = new int[100]; 
    listRange = fileList.getSelectedIndices(); 
    int i = 0; 
    //The counter of the removed items so far 
    int nbOfRemovedItems = 0; 

    while (i <= listRange.length) { 
     // After each remove, the index of the items is decreased by one 
     listModel.remove(listRange[i] - nbOfRemovedItems); 
     ++nbOfRemovedItems; 
     i++; 
    } 
}