这不是我的代码报的错,应该是jtable的使用方式的问题

解决方案 »

  1.   

    我设置一个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);
    }
      

  2.   

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

  3.   

    我已经把数据模型,放在了psf.getSendinfo()里面啊,更新界面的就是timer
      

  4.   


    关键是,JTable所使用数据模型,是否就是你其它线程所直接修改的?如果是,就必然会面临此类风险。
      

  5.   

    是在timer中修改的,有什么办法实现么,主要是用来显示多线程的信息
      

  6.   


    建议改为让Timer调用GUI主线程来更新数据。
        SwingUtilities.invokeLater(Runnable doRun)
    或者:
        SwingUtilities.invokeAndWait(Runnable doRun)
      

  7.   

    这样试试:  
    @Override
      public void run() {
                if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程
                  //...这里更新Jtable 
                     jtable.setDataSouse(psf.getSendinfo());
                }else {
                    SwingUtilities.invokeLater(this);
                }
            }
      

  8.   

    楼上正解,非常感谢我的修改了一下楼上的程序
    if (SwingUtilities.isEventDispatchThread()) { //AWT指派线程
                  //...这里更新Jtable 
                     jtable.setModel(tableModel));
                }其中else后面的删除掉了,因为我更新table是单独的函数,在线程中调用这个函数。因此else后边的代码在我的程序中不能用。
      

  9.   

    不知qq多少 我也遇到类似的问题了  我的jtable要求是实时更新  放在一个线程中直接用
    model = new DefaultTableModel(data, names);
    table.setModel(model);
    每次都会报异常