2014-09-24 81 views
1

我有延伸AbstractTableModel上的表模型和被用于该模型的数据库。某些进程正在向该模型动态添加行,并在每次将行添加到数据库时触发fireTableRowsInserted(lastRow,lastRow)。一切工作正常,除非我为该模型添加分拣机。在应用分类器之后,fireTableRowsInserted(lastRow,lastRow)抛出java.lang.ArrayIndexOutOfBoundsException,其中行仍然添加到模型中并显示在GUI1上。爪哇fireTableRowsInserted(INT,INT)与RowSorter的

所有进程/线程与Swing组件连通的调度上EDT。以下是该例外的完整堆栈跟踪。

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()对我来说是非常昂贵的。不能这样做。

回答

0

在OP的一个非常类似的情况,我的代码是这样的:

 glosEntryTableModel.addElement(ge); 
     int index = this.glseTable.convertRowIndexToView(glosEntryTableModel.getIndexOf(ge)); 
     // int index = glosEntryTableModel.getIndexOf(ge); 
     glosEntryTableModel.fireTableRowsInserted(index, index); 

正如你看到的,我已经试过这两个模型和视图坐标,但我得到打电话来fireTableRowsInserted异常,作为OP。

调试,我已经看到了fireTableRowsInserted在AbstractTableModel上包含此代码:

public void fireTableRowsInserted(int firstRow, int lastRow) { 
    fireTableChanged(new TableModelEvent(this, firstRow, lastRow, 
         TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); 
} 

和Java API文档说,

TableModelEvent用于表模型已发生更改通知听众。模型事件描述对TableModel的更改,所有对行和列的引用位于模型的坐标系中

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

目前,我只能认为JTable或TableRowSorter中的一些处理被延迟,导致fireTableRowsInserted实际上命名了一个在视图中不存在的行。但是,那不就是使用这种方法的原因吗?这可能是JDK中的错误吗?

我使用了一个相对较小的模式,所以我觉得我可以TableDataChanged woraround暂时的,但我想找到一个更好的解决方案了。

TIA

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