0

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

    //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();
4

1 回答 1

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);            
   }
}
于 2010-02-27T19:36:54.227 回答