2013-05-17 1 views
0

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

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; 
} 


} 

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

ответ

0

Я могу придумать пару причин, которые могут дать вам смешные результаты. Одна из причин может иметь отношение к вашему 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 вызываются. Для целей производительности все эти вызовы объединены в один вызов с последним аргументом вызова.

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