java - 为什么jList中的selectedIndex比集合大小大?

标签 java swing selection jlist indexoutofboundsexception

我正忙于 Java 中的 GUI 应用程序,在将值添加到 jList 时,有时会遇到 IndexOutOfBoundsExceptions。

选择一个值然后添加另一个值时似乎会发生异常。我有一个用于选择更改的监听器,因为当用户选择索引时需要发生一些事情,但是当添加新值时也会触发此事件。我使用自定义 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、它的列表模型和它的选择模型如何工作的人都会明白哪里出了问题。如有任何帮助,我们将不胜感激。

最佳答案

问题很可能是在将单个项添加到列表模型时调用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/

相关文章:

javascript - webkit (Safari/Chrome) 中的选择范围

java - 如何使用浏览器访问8080端口的tomcat?

java - Weka setClassIndex 和数据库

java - 计算字符串中没有任何循环的单词数量

Java JDBC 存储过程放入 List<T>

java - 使用多个面板将图像添加到 JFrame 内的 JPanel

java - JPanel 上的 paintComponent,图像闪烁然后消失

java - 如何使用 Netbeans 在 java(swing 组件)中输入泰米尔语?

c# - 获取DataGridView中选定的行

javascript - 如何将处理程序绑定(bind)到窗口上的选择更改?