gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:24:13 27 4
gpt4 key购买 nike

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

最佳答案

您一遍又一遍地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);
}
}

关于java - 使用 SwingWorker 向 jTable 添加行并更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com