0

ボタンがクリックされると、ゼロから始まる数字だけで一度に1行ずつ追加し、1000000行になるまで行を追加し続けるjTableを作成しようとしています。私はSwingWorkerのdoInBackground、publishおよび行カウンターをインクリメントし、各行を追加するメソッドを処理します。これは、行が追加されている間、GUI がフリーズしないことを意味します。ただし、実行すると、行番号が増加するのがわかりますが、1行しか追加されず、その1行が変更され続けます。つまり、1行がテーブルに追加され、その行番号が増加するため、最後に1行になり、以下は私の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();
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 に答える