Используйте SwingWorker для добавления строк в jTable и обновления графического интерфейса - PullRequest
0 голосов
/ 27 февраля 2010

Я пытаюсь создать jTable, который, после нажатия кнопки, добавляет строки по одной за раз с числом, начинающимся с нуля, и продолжает добавлять строки, пока не доберется до строки 1000000. Я использую doInBackground SwingWorker's , публиковать и обрабатывать методы для увеличения счетчика строк и добавления каждой строки, что означает, что графический интерфейс не останавливается во время добавления строк. Однако при запуске я вижу увеличение номера строки, однако он добавляет только одну строку и продолжает изменять эту строку, т. Е. Одна строка добавляется в таблицу, а ее номера увеличиваются, поэтому я получаю одну строку в конце с номер 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();

1 Ответ

4 голосов
/ 27 февраля 2010

Вы 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);            
   }
}
...