【问题标题】:JProgress Bar not updatingJProgress Bar 不更新
【发布时间】:2013-05-17 13:45:45
【问题描述】:

您好,我想在 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%)。为什么它在后台过滤时不更新? 谢谢!

【问题讨论】:

    标签: swingworker jprogressbar


    【解决方案1】:

    我能想到几个可能会给你带来有趣结果的原因。一个原因可能与您的throws Exception { 有关。您是否尝试过检查是否抛出了您尚未捕获的异常?我对 Java 还是很陌生,最近几周我只是在编写自己的工作,所以我仍然不熟悉 Java 可以自己修复什么以及它不能修复什么。其他几件事可以做到这一点。

    setProgress(int value);

    假设您的进度条是 0 到 100 之间的值,或许可以求解 setProgress 方法中的百分比。所以像:

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

    或者也许您应该尝试像这样setProgress((int)(i/100)); 投射int

    也许,它以 100% 工作的唯一原因是 i/100 等于整数。

    另外,这可能是微不足道的,但是当我设置进度条的新值时,我是这样做的:BitmapViewer.ProgressBar.setValue(bitmapFiller[i].getProgress());

    我能想到的最后一个原因是您的代码执行速度是否如此之快,以至于它只在PropertyChange 被触发的最后一次捕获PropertyChange

    来自手册:

    因为在事件调度线程上异步通知 PropertyChangeListeners,所以在调用任何 PropertyChangeListeners 之前可能会发生对 setProgress 方法的多次调用。出于性能目的,所有这些调用仅与最后一个调用参数合并为一个调用。

    我希望我对您的代码的理解足以对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多