使用SwingWorker向jTable添加行并更新GUI

时间:2010-02-27 19:06:15

标签: java user-interface swing jtable swingworker

我正在尝试创建一个jTable,一旦单击一个按钮,就会一次添加一行,只有一个从零开始的数字,并继续添加行,直到它到达行1000000.我正在使用SwingWorker的doInBackground ,发布和处理增加行计数器的方法,并添加每一行,这意味着在添加行时gui不会冻结。然而,当运行时,我可以看到行号递增但是它只添加一行并且不断更改那一行,即一行添加到表中并且其行号递增,所以我最后得到一行,最后一行数量为1000000.下面是我的SwingWorker代码,任何人都会非常感激,这个问题一直让我不眠之夜! :/

    //inside the button's ActionPerformed method

    SwingWorker<Vector, Vector> worker = new SwingWorker<Vector, Vector>() {

    @Override
    protected Vector doInBackground()
    {       
        int i = 0;
        Vector v = new Vector();
        //while(!isCancelled())
        while(i < 100000000)
        {
            v.clear();
            //v = gen.runAlgorithm2();
            v.add(i);

            i++;             
            publish(v); 
        }

        return v;
    }

    @Override
    protected void process(List rowsList)
    {
       if(rowsList.size() > 0)
       {
           Vector row = (Vector)rowsList.get(rowsList.size() - 1);
           DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel();

           //tModel.insertRow(0, row);
           tModel.addRow(row);            
       }

    }
    };
    worker.execute();

1 个答案:

答案 0 :(得分:4)

你一遍又一遍publish()同一个Vector对象。一旦publish(),就必须创建一个新的。试试这个:

@Override
protected Vector doInBackground()
{       
    int i = 0;
    while(i < 100000000)
    {
        Vector v = new Vector();
        v.add(i);

        i++;             
        publish(v); 
    }

    return v;
}

要解决跳过行的问题,您只需要处理rowsList中的每个元素,而不是仅处理第一个元素。像这样:

@Override
protected void process(List<Vector> rowsList)
{
   for(Vector row : rowsList){
       DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel();
       tModel.addRow(row);            
   }
}