您好我想在Swing Worker类的帮助下更新我的JProgress Bar。我在这个论坛中搜索了关于这个主题的其他问题,并采取了一些解决方案的代码,但在我的情况下,我不工作:(我有两个类:在第一个类我用这个代码创建一个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;
}
}
问题是进度条在过滤完成时更新(100%)。为什么它在后台过滤时不会更新? 谢谢!
答案 0 :(得分: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,所以在调用任何PropertyChangeListener之前,可能会对setProgress方法进行多次调用。出于性能目的,所有这些调用仅与最后一个调用参数合并为一个调用。
我希望我能够理解您的代码,以便提供帮助。