我正在尝试创建一个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();
答案 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);
}
}