2012-04-13 68 views
0

我忙於使用Java中的GUI應用程序,其中有時會在將值添加到jList時遇到IndexOutOfBoundsExceptions。爲什麼jList中的selectedIndex大於集合大小?

當選擇一個值,然後添加另一個值時,似乎發生異常。我有一個用於選擇更改的偵聽器,因爲用戶選擇索引時需要執行某些操作,但添加新值時也會觸發此事件。我使用自定義ListModel,它只是擴展AbstractListModel,並以完全有效的方式覆蓋必要的方法。

  1. 爲什麼當值被添加到列表中時,程序中的選擇會發生變化?這不是視覺表現。
  2. 爲什麼jList允許選擇一個並非真正存在的索引?

我已經兩次使用jList兩次了(我們最近開始在學校做GUI),並且我都遇到了這個問題。我第一次通過在添加值之前清除選擇來解決它,但這不是一個很好的解決方案。我不認爲這是必要的。

我不知道爲什麼會出現這種情況,我沒有任何奇怪的代碼或任何東西。在僞代碼,這是發生了什麼:

listmodel.addValue(object); 
listmodel.fireIntervalAdded(); 
//selection event occurs 
selectedObject = listmodel.getValueAt(list.getSelectedIndex()); //indexoutofboundsexception 
//index = 5, size = 3 (for example) when there are 2 objects in list and first is selected. 

我現在不提供更多的代碼,因爲我認爲這不是真正相關。我認爲任何能夠完全理解jList,其列表模型及其選擇模型如何工作的人都會明白出了什麼問題。任何對此的幫助表示讚賞。

+0

我會看看你的'ListModel'。不知何故'JList'與你的'ListModel'不同步。也許你可以發佈你的'ListModel'源代碼。 – 2012-04-13 23:00:51

+0

listmodel非常簡單。它有一個用於存儲項目的數組列表(可能這不是正確的集合?),它只有5種方法:添加對象,刪除對象,刪除索引,獲取對象並獲取對象的索引。其中四種方法只是在數組列表上調用適當的方法。當一個項目被刪除,我做'fireIntervalRemoved(this,0,list.size());',當一個項目被添加我做'fireIntervalAdded(this,0,list.size());'然後我排序數組列表。想想看,排序可能是造成麻煩的原因... – MarioDS 2012-04-13 23:05:40

+0

要小心:_do not_從模型外部的代碼調用任何fireXX方法 - 通知其監聽者是**模型的基本職責本身,它必須在addValue方法中實現 – kleopatra 2012-04-14 09:03:39

回答

3

這個問題很可能是因爲您將單件項目添加到您的列表模型中而打電話給fireIntervalAdded(this, 0, list.size())。該signature是:

protected void fireIntervalAdded(Object source, int index0, int index1) 

注意index0是添加的項目的起始索引和index1是結束索引。因此,對於單個項目index0應該與index1相同。當您撥打​​與0, list.size()時,您告訴JList已添加N個項目,其中N = list.size()。因此JList認爲有更多的項目比你的列表模型。

刪除項目時也是如此。

+0

我從來沒有真正理解這種方法。 javadoc說index1甚至不需要大於index0。我現在通過在事件處理程序中添加一個檢查來更改選擇來解決我的問題,以查看所選索引是否大於1. - 我會通知您是否確定了真正的問題。 – MarioDS 2012-04-13 23:28:44

+0

那就是了,謝謝。我真的責怪我的老師,她說,把這些事件發佈到整個清單是完全正確的,因爲它並不在意真正改變了多少。廢話平平無奇。非常感謝!! – MarioDS 2012-04-13 23:35:34