2012-04-13 62 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

相关问题