我正忙于 Java 中的 GUI 应用程序,在将值添加到 jList 时,有时会遇到 IndexOutOfBoundsExceptions。
选择一个值然后添加另一个值时似乎会发生异常。我有一个用于选择更改的监听器,因为当用户选择索引时需要发生一些事情,但是当添加新值时也会触发此事件。我使用自定义 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、它的列表模型和它的选择模型如何工作的人都会明白哪里出了问题。如有任何帮助,我们将不胜感激。
最佳答案
问题很可能是在将单个项添加到列表模型时调用fireIntervalAdded(this, 0, list.size())
。 signature是:
protected void fireIntervalAdded(Object source, int index0, int index1)
请注意,index0
是添加项的起始索引,index1
是结束索引。因此,对于单个项目,index0
应与 index1
相同。当您使用 0, list.size()
调用 fireIntervalAdded
时,您是在告诉 JList 已添加 N 个项目,其中 N=list.size()
。因此,JList
认为项目数量多于列表模型中的项目数量。
删除项目时也是如此。
关于java - 为什么jList中的selectedIndex比集合大小大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10149322/