Панель JProgress не обновляется

Здравствуйте, я хочу обновить свою панель JProgress с помощью класса Swing Worker. Я искал другие вопросы по этой теме на этом форуме и взял некоторый код решения, но в моем случае я не работаю :( У меня есть два класса: в первом классе я создаю объект класса Swing Worker BitmapFilterParralelGrey с этим кодом :

Greyscale.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {



                int numThreads = Runtime.getRuntime().availableProcessors();
                int HeightPerThread = image.getHeight() / numThreads;
                BitmapFilterParallelGrey[] bitmapFilter = new BitmapFilterParallelGrey[numThreads];
                int startRow = 0, endRow = 0;
                for (int i = 0; i < numThreads; ++i) {
                    startRow = i * HeightPerThread;
                    endRow = startRow + HeightPerThread;
                    bitmapFilter[i] = new BitmapFilterParallelGrey(image,
                            startRow, endRow);

                    bitmapFilter[i].addPropertyChangeListener(new PropertyChangeListener() {

                          @Override
                            public void propertyChange(PropertyChangeEvent e) {
                                if ("progress".equals(e.getPropertyName())) {
                                    BitmapViewer.ProgressBar.setIndeterminate(false);
                                    BitmapViewer.ProgressBar.setValue((Integer) e.getNewValue());

                                }
                            }
                        });
                    bitmapFilter[i].execute();

                }


                for (int i = 0; i < numThreads; i++) {
                    try {
                        bitmapFilter[i].get();
                    } catch (ExecutionException | InterruptedException e) {
                        e.printStackTrace();
                }
                    }


                showImage();

        }
    });

поскольку выполнение в классе SwingWorker должно быть многопоточным, я создаю несколько объектов в цикле. В моем втором классе BitmapFilterParallelGrey я фильтрую изображение в doInBackground() и устанавливаю ProgressValue. Код:

public class BitmapFilterParallelGrey extends SwingWorker<Void, Void> {
BufferedImage image;
private int startRow, endRow;


public BitmapFilterParallelGrey(BufferedImage image, int startRow, int endRow){
    this.image = image;
    this.startRow= startRow;
    this.endRow= endRow;

    }
@Override
public Void doInBackground() throws Exception {

    int width = image.getWidth();

    for(int i=startRow; i<endRow; i++)
    {
        for(int j=0; j<width; j++)
        {

        //Filter image

}
        setProgress(i/100);

        Thread.sleep(10);

    }
    return null;
}


}

Проблема в том, что Progress Bar обновляется при завершении фильтрации (100%). Почему он не обновляется во время фильтрации в фоновом режиме? Спасибо!


person Jan_K.    schedule 17.05.2013    source источник


Ответы (1)


Я могу придумать пару причин, которые могут дать вам забавные результаты. Одна из причин может быть связана с вашим throws Exception {. Пробовали ли вы проверить, выбрасываются ли какие-либо исключения, которые вы не поймали? Я все еще новичок в Java, я программировал свою собственную работу только последние пару недель, поэтому я до сих пор не знаком с тем, что Java может исправить самостоятельно, а что нет. Еще пара вещей, которые могли бы это сделать.

setProgress(int value);

Предполагая, что ваш индикатор выполнения имеет значения от 0 до 100, возможно, найдите процент в методе setProgress. Итак, что-то вроде:

setProgress((int)((100*(i - startRow))/(endRow - startRow)));

Или, возможно, вы должны просто попробовать int вот так setProgress((int)(i/100));

Возможно, единственная причина, по которой он работает на 100%, заключается в том, что i/100 равно целому числу.

Кроме того, это может быть тривиально, но когда я установил новое значение индикатора выполнения, я сделал это так: BitmapViewer.ProgressBar.setValue(bitmapFiller[i].getProgress());

Последняя причина, о которой я могу думать, заключается в том, что ваш код выполняется так быстро, что он перехватывает PropertyChange только в последний раз, когда PropertyChange срабатывает.

Из руководства:

Поскольку PropertyChangeListeners уведомляются асинхронно в потоке отправки событий, несколько вызовов метода setProgress могут происходить до того, как будут вызваны какие-либо PropertyChangeListeners. В целях повышения производительности все эти вызовы объединяются в один вызов только с последним аргументом вызова.

Я надеюсь, что понял ваш код достаточно, чтобы быть полезным.

person SimpleProgrammer    schedule 27.05.2013