Java 使用SwingWorker向jTable添加行并更新GUI
我试图创建一个jTable,一旦单击一个按钮,它一次添加一行,其中一个数字从零开始,然后继续添加行,直到达到第1000000行。我使用SwingWorker的doInBackground、publish和process方法来增加行计数器并添加每一行,这意味着添加行时gui不会冻结。然而,当运行时,我可以看到行号在增加,但它只增加了一行,并不断更改这一行,即,一行被添加到表中,其行号也在增加,因此最后我得到了一行,行数为1000000。下面是我的SwingWorker代码,任何hep都将不胜感激,这个问题让我夜不能寐!!:/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都将不胜感激,
//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添加每一行。