2014-09-24 62 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引發異常的延期處理的想法。