2012-02-11 72 views
1

我每次我試圖在我的JTable更新數據時收到此錯誤:爲什麼我在線程「AWT-EventQueue-0」中得到異常java.lang.ArrayIndexOutOfBoundsException:2?

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:501) 
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2620) 
at javax.swing.JTable.getValueAt(JTable.java:2695) 
at javax.swing.JTable.prepareRenderer(JTable.java:5712) 
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2069) 
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1971) 
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1767) 
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143) 
at javax.swing.JComponent.paintComponent(JComponent.java:751) 
at javax.swing.JComponent.paint(JComponent.java:1017) 
at javax.swing.JComponent.paintChildren(JComponent.java:852) 
at javax.swing.JComponent.paint(JComponent.java:1026) 
at javax.swing.JViewport.paint(JViewport.java:747) 
at javax.swing.JComponent.paintChildren(JComponent.java:852) 
at javax.swing.JComponent.paint(JComponent.java:1026) 
at javax.swing.JComponent.paintChildren(JComponent.java:852) 
at javax.swing.JComponent.paint(JComponent.java:1026) 
at javax.swing.JComponent.paintChildren(JComponent.java:852) 
at javax.swing.JComponent.paint(JComponent.java:1026) 
at javax.swing.JComponent.paintChildren(JComponent.java:852) 
at javax.swing.JComponent.paint(JComponent.java:1026) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5112) 
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278) 
at javax.swing.RepaintManager.paint(RepaintManager.java:1220) 
at javax.swing.JComponent._paintImmediately(JComponent.java:5060) 
at javax.swing.JComponent.paintImmediately(JComponent.java:4870) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714) 
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694) 
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

的數據似乎更新罰款,但事情錯了,它困擾着我,它甚至沒有提及我的任何代碼。一段時間調試後,我決定下面的代碼行是造成問題的原因:

public class LoadingLogListThread extends Thread{ 

... 

public void run() { 

... 
int colNo = rsmd.getColumnCount(); 

while(rs.next()){ 
    Object[] objects = new Object[colNo]; 
    for(int i=0;i<colNo;i++){ 
     objects[i]=rs.getObject(i+1); 
    } 
    if(objects != null) 
     aModel.addRow(objects); 
    count++; 
} 

mainView.logEntryTable.setModel(aModel); 
... 

} 

的線程被創建,當我點擊一個按鈕來過濾列表,然後又回到了到開始數據庫來獲取更多可能超出已獲取數據的數據。我打算稍後確定是否需要新的提取,並且僅在此情況下執行上述操作,否則僅過濾已提取的結果。

+0

你如何更新表中的數據? – akf 2012-02-11 03:24:18

+0

查看上述更新代碼的最後一行,瞭解如何更新表中的數據。基本上我只是將表格的模型設置爲新模型。 – 2012-02-11 03:36:13

+0

1.這是更新表格的不好方法。發起適當的事件。 2.如果您在非事件派發線程的表中設置模型,並且事件派發線程正在繪製,則基礎模型可能會更改導致問題的原因模型。 – LazyCubicleMonkey 2012-02-11 03:50:52

回答

0

您需要更新Event Dispatch Thread上的模型。你正確地產生一個新的線程來執行一些工作,尤其是在數據從數據庫中獲取的時候。試試這個:

public class LoadingLogListThread extends Thread{ 

... 

public void run() { 

... 
int colNo = rsmd.getColumnCount(); 

while(rs.next()){ 
    Object[] objects = new Object[colNo]; 
    for(int i=0;i<colNo;i++){ 
     objects[i]=rs.getObject(i+1); 
    } 
    if(objects != null) 
     aModel.addRow(objects); 
    count++; 
} 

SwingUtilities.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     mainView.logEntryTable.setModel(aModel); 
    } 

}); 

... 

} 
+0

我現在嘗試創建行以後調用,但我仍然得到異常。 如果我稍後使用調用,我會得到異常重現。 – 2015-10-22 09:37:01

+0

對我來說,我不得不將RowsInserted更改爲TableDataChanged。 fireTableRowsInserted(getRowCount() - 1,getRowCount() - 1); \t fireTableDataChanged();/*在默認行分類器中避免索引數組越界異常* / – 2015-10-22 10:10:40

相關問題