我忙于使用Java中的GUI应用程序,其中有时会在将值添加到jList时遇到IndexOutOfBoundsExceptions。为什么jList中的selectedIndex大于集合大小?
当选择一个值,然后添加另一个值时,似乎发生异常。我有一个用于选择更改的侦听器,因为用户选择索引时需要执行某些操作,但添加新值时也会触发此事件。我使用自定义ListModel
,它只是扩展AbstractListModel
,并以完全有效的方式覆盖必要的方法。
- 为什么当值被添加到列表中时,程序中的选择会发生变化?这不是视觉表现。
- 为什么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,其列表模型及其选择模型如何工作的人都会明白出了什么问题。任何对此的帮助表示赞赏。
我会看看你的'ListModel'。不知何故'JList'与你的'ListModel'不同步。也许你可以发布你的'ListModel'源代码。 – 2012-04-13 23:00:51
listmodel非常简单。它有一个用于存储项目的数组列表(可能这不是正确的集合?),它只有5种方法:添加对象,删除对象,删除索引,获取对象并获取对象的索引。其中四种方法只是在数组列表上调用适当的方法。当一个项目被删除,我做'fireIntervalRemoved(this,0,list.size());',当一个项目被添加我做'fireIntervalAdded(this,0,list.size());'然后我排序数组列表。想想看,排序可能是造成麻烦的原因... – MarioDS 2012-04-13 23:05:40
要小心:_do not_从模型外部的代码调用任何fireXX方法 - 通知其监听者是**模型的基本职责本身,它必须在addValue方法中实现 – kleopatra 2012-04-14 09:03:39