日期:2014-05-20  浏览次数:20860 次

多线程更新Jtable时报错,求助
AbstractTableModel.fireTableStructureChanged();
在其它线程,不是主线程调用,但不这一句报的错,应该JTable后台线程报出来的,无法通过try catch捕获
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintGrid(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
------最佳解决方案--------------------
引用:
是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息


建议改为让Timer调用GUI主线程来更新数据。
    SwingUtilities.invokeLater(Runnable doRun)
或者:
    SwingUtilities.invokeAndWait(Runnable doRun)
------其他解决方案--------------------
数组越界了啊
------其他解决方案--------------------
这不是我的代码报的错,应该是jtable的使用方式的问题
------其他解决方案--------------------
我设置一个timer,jtable.setDataSouse(psf.getSendinfo());

public synchronized void setDataSouse(Collection<Object> vsourse) {

tm.fireTableStructureChanged();


list.clear();

this.sourse = vsourse;
List<String> rec_List = null;
Class<?> c = null;
String value = null;
for (Object o : sourse) {
.....
list.add(rec_List);
}
// tm.fireTableStructureChanged();
if (jt.getRowCount() > 0)
jt.setRowSelectionInterval(jt.getRowCount() - 1,
jt.getRowCount() - 1);
}



------其他解决方案--------------------
估摸着是同步没控制好,你某线程在改数据模型内容的时候,GUI线程在让JTable更新界面。

考虑线程所修改的数据模型,应该独立出来一份,修改OK了,再让GUI线程切换过去用。
------其他解决方案--------------------
引用:
估摸着是同步没控制好,你某线程在改数据模型内容的时候,GUI线程在让JTable更新界面。