多线程更新Jtable时报错,求助 这不是我的代码报的错,应该是jtable的使用方式的问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我设置一个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线程切换过去用。 我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer 关键是,JTable所使用数据模型,是否就是你其它线程所直接修改的?如果是,就必然会面临此类风险。 是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息 建议改为让Timer调用GUI主线程来更新数据。 SwingUtilities.invokeLater(Runnable doRun)或者: SwingUtilities.invokeAndWait(Runnable doRun) 这样试试: @Override public void run() { if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程 //...这里更新Jtable jtable.setDataSouse(psf.getSendinfo()); }else { SwingUtilities.invokeLater(this); } } 楼上正解,非常感谢我的修改了一下楼上的程序if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程 //...这里更新Jtable jtable.setModel(tableModel)); }其中else后面的删除掉了,因为我更新table是单独的函数,在线程中调用这个函数。因此else后边的代码在我的程序中不能用。 不知qq多少 我也遇到类似的问题了 我的jtable要求是实时更新 放在一个线程中直接用model = new DefaultTableModel(data, names);table.setModel(model);每次都会报异常 BufferedInputStream字节个数获取方法 服务器关机时怎样将程序中的数据写入到硬盘中 netbeans中打开新窗口的问题 刚接触AWT很晕,请高手看看我这个程序是怎么了 斗地主游戏,谁来帮我测试啊 用ByteBuffer写文件的性能问题 散分! 网络爬虫被阻止 JBuilder界面插件1.3.1,强烈建议下载此最新版本,酷!!!(20030616) java Application 如何调用帮助文档(在线等待) 求对角线元素之和出现数组越界 求解决. cmd运行java时出现NoClassDefFoundError错误是什么原因
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);
}
关键是,JTable所使用数据模型,是否就是你其它线程所直接修改的?如果是,就必然会面临此类风险。
建议改为让Timer调用GUI主线程来更新数据。
SwingUtilities.invokeLater(Runnable doRun)
或者:
SwingUtilities.invokeAndWait(Runnable doRun)
@Override
public void run() {
if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程
//...这里更新Jtable
jtable.setDataSouse(psf.getSendinfo());
}else {
SwingUtilities.invokeLater(this);
}
}
if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程
//...这里更新Jtable
jtable.setModel(tableModel));
}其中else后面的删除掉了,因为我更新table是单独的函数,在线程中调用这个函数。因此else后边的代码在我的程序中不能用。
model = new DefaultTableModel(data, names);
table.setModel(model);
每次都会报异常