当前位置: 首页 > 知识库问答 >
问题:

应用分拣机时删除JTable行会导致IndexOutOfBoundsException

呼延烈
2023-03-14

我有一个JTable,其中有一行自定义对象,其中一列是倒计时的时间组件。当倒计时达到0时,该行将自动删除。

我还通过文本框提供了一个过滤选项,用户可以在其中键入文本框,根据数据过滤行。

如果没有应用于JTable的排序器,除了过滤之外,一切都可以正常工作(当时间计数为0时,行会自行删除)。应用排序器会给我一个"java.lang.IndexOutOfBoundsException:无效索引"

我的定制桌子模型如下所示

public Object getValueAt(int rowIndex, int columnIndex) {

    CustomObject myObject = customObjects.get(rowIndex);
    if (columnIndex == MyFirstColumn) {
        return myObject.getData1();
    } else if (columnIndex == MySecondColumn) {
        return myObject.getData2();
    } else if (columnIndex == TimeRemainingColumn) {
        if (myObject.getDate() - System.currentTimeMillis() <= 0) {

            //If I comment this out I can filter but not remove rows
            removeRow(myObject); 

            return 0;
        }
        else{
            fireTableDataChanged();
            return myObject.getDate() - System.currentTimeMillis();
        }  
    }

    return DateFormat.getDateInstance().format(new Date(myObject.getDate()));
}


public void removeRow(CustomObject object) {
    int row = customObjects.indexOf(object);
    customObjects.remove(object);
    fireTableRowsDeleted(row, row);
}

这引发了这个异常

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2645)
at javax.swing.JTable.getValueAt(JTable.java:2720)
at javax.swing.JTable.prepareRenderer(JTable.java:5718)
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
....

去DefaultRowSorter。java它遇到了这个异常

public int convertRowIndexToModel(int index) {
    if (viewToModel == null) {
        if (index < 0 || index >= getModelWrapper().getRowCount()) {
            throw new IndexOutOfBoundsException("Invalid index");
        }
        return index;
    }
    return viewToModel[index].modelIndex;
}

向上另一个层次,为什么删除工作没有排序器(排序器==null)

public int convertRowIndexToModel(int viewRowIndex) {
    RowSorter sorter = getRowSorter();
    if (sorter != null) {
        return sorter.convertRowIndexToModel(viewRowIndex);
    }
    return viewRowIndex;
}

首先调试一点Row和endRow在那一点上都是0(它们应该是?)但它似乎试图对空列表进行排序/过滤

这是我的表格代码

    myModel = new CustomObjectDataModel();

    myTable.setModel(myModel);
    mySorter = new TableRowSorter(myModel);

    myTable.setRowSorter(mySorter);
    myTable.setAutoCreateRowSorter(true);

我四处搜索,发现了暗示这是Java错误的死链接,但无法确认。

共有1个答案

龚博涛
2023-03-14

我按照建议使用Swing Timers实现了这一点并修复了问题,但这里的问题是在EDT之外修改表模型

 类似资料:
  • 问题内容: 我有一个ReactJS HTML表格组件,并使用方法更新了它的内容(单元格值)。这是基本代码: 您可以这样使用它: 大部分时间都在工作。我可以通过执行以下操作来更改数据(在函数中的某处): 如您所见,它将在表的末尾添加一行。但是,如果我尝试在此更新后设置初始数据,或者以任何方式通过设置为较小的数组(例如应删除最后一行)来 缩短 行数: 我收到此错误: TypeError:updated

  • 在本例中,我在一个包含2个副本的部署中运行“echoheaders”Nginx。当我删除一个pod时,我有时会收到约40秒的缓慢响应和错误。 我们正在库伯内特斯运行我们的API网关,并且需要能够允许库伯内特斯调度程序在它认为合适的时候处理pod。 我们最近想引入会话相关性,为此,我们想迁移到新的闪亮的NEG:网络endpoint组:https://cloud.google.com/load-bal

  • 我正在用java创建一个没有数据库的库系统程序。(直接使用文件)。 我在删除jtable中的一行时遇到了一个奇怪的问题(也就是从文件中删除)。 有时当我在表格中选择一行并单击删除按钮时,不止一行被删除了! 大多数时候它也能正常工作!! 我的代码: 我的模型类: 用户信息类别: 我的文本文件:

  • 我的Jtable有一个listSelectionListener: 我创建了一个按钮来删除带有事件的Jtable的所有行: 如果我在没有选择任何行的情况下按下按钮,则不会出现错误,但当我选择一行,然后按下按钮时,会出现以下错误: 当表没有ListSseltionListener时,不会发生这种情况。我哪里错了? 提前感谢您的帮助。

  • 网页端开启“订单分拣”插件后,手机端登录亿景智图APP,默认进入分拣状态,在搜索框中输入 地址,可完成地址所属区域的分拣操作,适用于外勤人员。点可切换到地图编辑状态。

  • 问题内容: 编辑: 在Github 上正在讨论一个相关的问题,但是在另一种部署模式下(Typesafe Activator UI,而不是Docker)。 我试图模拟系统重启,以验证Docker重启策略,该策略声明能够按照正确的顺序重新运行容器。 我有一个用Java编写的Play框架应用程序。 Dockerfile看起来像这样: 我使用开始。 当我 然后控制台告诉我: 编辑: 当我按照Play文档的