读书人

多线程更新Jtable时报错

发布时间: 2012-12-19 14:13:15 作者: rapoo

多线程更新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更新界面。



考虑线程所修改的数据模型,应该独立出来一份,修改OK了,再让GUI线程切换过去用。




我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer
[其他解释]
引用:
我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer


关键是,JTable所使用数据模型,是否就是你其它线程所直接修改的?如果是,就必然会面临此类风险。
[其他解释]
是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息
[其他解释]
谢谢了。第一次用桌面的东西,太多东西不明白了,都被C#误导了

读书人网 >J2SE开发

热点推荐