为什么jList中的selectedIndex大于集合大小?

时间:2012-04-13 22:55:40

标签: java swing selection jlist indexoutofboundsexception

我正在忙着使用Java中的GUI应用程序,当有一个值添加到jList时,我有时会遇到IndexOutOfBoundsExceptions。

当选择一个值,然后添加另一个值时,似乎会发生异常。我有一个选择更改的监听器,因为当用户选择索引时需要发生某些事情,但是当添加新值时也会触发此事件。我使用只扩展ListModel的自定义AbstractListModel,并以完全有效的方式覆盖必要的方法。

  1. 为什么在将值添加到列表时,程序中的选择会发生变化?这在视觉上没有表现出来。
  2. 为什么jList允许选择不存在的索引?
  3. 我现在已经两次使用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及其选择模型如何工作的人都能理解错误。对此有任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

当您将单个项添加到列表模型时,问题很可能是您正在调用fireIntervalAdded(this, 0, list.size())signature是:

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

请注意,index0是添加项的起始索引,index1是结束索引。因此,单个项目index0应与index1相同。当您使用fireIntervalAdded调用0, list.size()时,您告诉JList已添加N个项目,其中N = list.size()。因此,JList认为项目列表模型中的项目数量更多。

删除项目时也是如此。