多线程更新Jtable时报错,求助

wumingbing_8027 2012-11-14 03:26:08
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)
...全文
433 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello在么 2014-07-28
  • 打赏
  • 举报
回复
不知qq多少 我也遇到类似的问题了 我的jtable要求是实时更新 放在一个线程中直接用 model = new DefaultTableModel(data, names); table.setModel(model); 每次都会报异常
wkxianyun 2013-02-22
  • 打赏
  • 举报
回复
楼上正解,非常感谢 我的修改了一下楼上的程序 if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程 //...这里更新Jtable jtable.setModel(tableModel)); } 其中else后面的删除掉了,因为我更新table是单独的函数,在线程中调用这个函数。因此else后边的代码在我的程序中不能用。
bigfive 2013-01-05
  • 打赏
  • 举报
回复
这样试试: @Override public void run() { if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程 //...这里更新Jtable jtable.setDataSouse(psf.getSendinfo()); }else { SwingUtilities.invokeLater(this); } }
wumingbing_8027 2012-11-15
  • 打赏
  • 举报
回复
谢谢了。第一次用桌面的东西,太多东西不明白了,都被C#误导了
MiceRice 2012-11-15
  • 打赏
  • 举报
回复
引用 7 楼 wumingbing_8027 的回复:
是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息
建议改为让Timer调用GUI主线程来更新数据。 SwingUtilities.invokeLater(Runnable doRun) 或者: SwingUtilities.invokeAndWait(Runnable doRun)
wumingbing_8027 2012-11-15
  • 打赏
  • 举报
回复
是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息
MiceRice 2012-11-14
  • 打赏
  • 举报
回复
引用 5 楼 wumingbing_8027 的回复:
我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer
关键是,JTable所使用数据模型,是否就是你其它线程所直接修改的?如果是,就必然会面临此类风险。
wumingbing_8027 2012-11-14
  • 打赏
  • 举报
回复
引用 4 楼 ldh911 的回复:
估摸着是同步没控制好,你某线程在改数据模型内容的时候,GUI线程在让JTable更新界面。 考虑线程所修改的数据模型,应该独立出来一份,修改OK了,再让GUI线程切换过去用。
我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer
MiceRice 2012-11-14
  • 打赏
  • 举报
回复
估摸着是同步没控制好,你某线程在改数据模型内容的时候,GUI线程在让JTable更新界面。 考虑线程所修改的数据模型,应该独立出来一份,修改OK了,再让GUI线程切换过去用。
wumingbing_8027 2012-11-14
  • 打赏
  • 举报
回复
我设置一个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); }
wumingbing_8027 2012-11-14
  • 打赏
  • 举报
回复
这不是我的代码报的错,应该是jtable的使用方式的问题
suciver 2012-11-14
  • 打赏
  • 举报
回复
数组越界了啊

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧