こんにちは、Swing Worker クラスを使用して JProgress Bar を更新したいと考えています。このフォーラムでこのトピックに関する他の質問を検索し、解決策のコードをいくつか取りましたが、私の場合は機能しません:( 2 つのクラスがあります。最初のクラスでは、このコードを使用して 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 クラスでの実行はスレッド化されるため、ループ内にいくつかのオブジェクトを作成します。2 番目のクラス 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%)。バックグラウンドでフィルタリングしている間、更新しないのはなぜですか? ありがとう!