首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java fireTableRowsInserted(int,int)与RowSorter

Java fireTableRowsInserted(int,int)与RowSorter
EN

Stack Overflow用户
提问于 2014-09-24 15:23:11
回答 2查看 841关注 0票数 2

我有一个扩展AbstractTableModel的表模型和一个用于该模型的数据库。一些进程在每次将行添加到数据库时都会动态地向该模型添加行,并触发fireTableRowsInserted(lastRow,lastRow)。除非我在那个型号上加了一个分类器,否则一切都很好。应用分类器之后,fireTableRowsInserted(lastRow,lastRow)将抛出java.lang.ArrayIndexOutOfBoundsException,其中as行仍在添加到模型中,并显示在GUIl上。

所有与Swing组件通信的进程/线程都是在EDT上调度的。下面是该异常的完整堆栈跟踪。

代码语言:javascript
复制
java.lang.ArrayIndexOutOfBoundsException: 281
at javax.swing.DefaultRowSorter.setModelToViewFromViewToModel(DefaultRowSorter.java:734)
at javax.swing.DefaultRowSorter.rowsInserted0(DefaultRowSorter.java:1063)
at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:868)
at javax.swing.JTable.notifySorter(JTable.java:4272)
at javax.swing.JTable.sortedTableChanged(JTable.java:4120)
at javax.swing.JTable.tableChanged(JTable.java:4397)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:296)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:231)
at View.AllData.CenterSection.DataModel$1.run(DataModel.java:143)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

这可能就是这个例外的原因吗?以及潜在的解决方案。现在大概7到8小时了,我正努力想办法解决这件事,但却发现什么都没有用。任何帮助都是对我的感激。

提前谢谢。

我需要显示的数据非常巨大,所以fireTableDataChanged()对我来说非常昂贵。不能这么做。

EN

回答 2

Stack Overflow用户

发布于 2014-09-24 22:37:25

最有可能的是,您忘记了http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting格言,“当使用分类器时,始终记住要翻译单元格坐标。”

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 21:16:44

在OP的类似情况下,我的代码如下:

代码语言:javascript
复制
        glosEntryTableModel.addElement(ge);
        int index = this.glseTable.convertRowIndexToView(glosEntryTableModel.getIndexOf(ge));
        // int index = glosEntryTableModel.getIndexOf(ge);
        glosEntryTableModel.fireTableRowsInserted(index, index);

正如您所看到的,我尝试使用模型坐标和视图坐标,但是在调用fireTableRowsInserted作为OP时得到了异常。

调试时,我看到fireTableRowsInserted在AbstractTableModel中包含以下代码:

代码语言:javascript
复制
public void fireTableRowsInserted(int firstRow, int lastRow) {
    fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
                         TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}

Java文档说

TableModelEvent用于通知侦听器表模型已更改。模型事件描述对TableModel的更改,所有对行和列的引用都在模型的协调系统中。

因此,如果您已经在使用模型坐标,则不需要转换坐标。作为OP,在我的示例中,行实际上被插入到JTable中,这意味着,即使它被插入/显示在视图中与模型中不同的行中,行数也应该是相同的,前提是不进行过滤(确实是我的情况)。

目前,我只能认为JTable或TableRowSorter中的某些处理被延迟了,这导致fireTableRowsInserted实际上指定了视图中不存在的行。但是,难道这不正是使用这种方法的原因吗?这可能是JDK中的一个bug吗?

我使用的是一个相对较小的模型,所以我认为我暂时可以使用TableDataChanged,但我也想找到一个更好的解决方案。

提亚

更新:刚刚意识到,对于其他JTable,我有几乎相同形式的代码,而且不会失败。唯一的区别是,第二个表只包含几行,而我引用并触发异常的代码的另一个行现在管理大约200行。因此,我倾向于JDK延迟处理的想法,这会导致异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26020724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档