Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SwingWorker向jTable添加行并更新GUI_Java_User Interface_Swing_Jtable_Swingworker - Fatal编程技术网

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

Java 使用SwingWorker向jTable添加行并更新GUI,java,user-interface,swing,jtable,swingworker,Java,User Interface,Swing,Jtable,Swingworker,我试图创建一个jTable,一旦单击一个按钮,它一次添加一行,其中一个数字从零开始,然后继续添加行,直到达到第1000000行。我使用SwingWorker的doInBackground、publish和process方法来增加行计数器并添加每一行,这意味着添加行时gui不会冻结。然而,当运行时,我可以看到行号在增加,但它只增加了一行,并不断更改这一行,即,一行被添加到表中,其行号也在增加,因此最后我得到了一行,行数为1000000。下面是我的SwingWorker代码,任何hep都将不胜感激,

我试图创建一个jTable,一旦单击一个按钮,它一次添加一行,其中一个数字从零开始,然后继续添加行,直到达到第1000000行。我使用SwingWorker的doInBackground、publish和process方法来增加行计数器并添加每一行,这意味着添加行时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();
//在按钮的ActionPerformed方法中
SwingWorker worker=新SwingWorker(){
@凌驾
受保护向量doInBackground()
{       
int i=0;
向量v=新向量();
//而(!isCancelled())
而(i<100000000)
{
v、 清除();
//v=gen.runAlgorithm2();
v、 加(i);
i++;
出版(五);
}
返回v;
}
@凌驾
受保护的无效进程(列表行列表)
{
如果(rowsList.size()>0)
{
Vector row=(Vector)rowsList.get(rowsList.size()-1);
DefaultTableModel tModel=(DefaultTableModel)jTable1.getModel();
//t模型插入行(0,行);
tModel.addRow(行);
}
}
};
worker.execute();
您正在
publish()
一次又一次地使用相同的
向量
对象。发布()后,必须创建一个新的。请尝试以下方法:

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

        i++;             
        publish(v); 
    }

    return v;
}
您正在一次又一次地对同一个
向量
对象执行
publish()。发布()后,必须创建一个新的。请尝试以下方法:

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

        i++;             
        publish(v); 
    }

    return v;
}

非常感谢您的回复,这解决了只向表中添加一行的问题。但是现在每行之间的行号增加了几千,我理解这是因为不是每次调用publish()时都运行process方法,并且向量在调用process之前一直在排队。我不知道如何克服这个问题,添加0-1000000之间的每一行。非常感谢您的回复,这解决了只向表中添加一行的问题。但是现在每行之间的行号增加了几千,我理解这是因为不是每次调用publish()时都运行process方法,并且向量在调用process之前一直在排队。我不知道如何克服这个问题,从0到1000000添加每一行。