Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swingworker JP进程栏未更新_Swingworker_Jprogressbar - Fatal编程技术网

Swingworker JP进程栏未更新

Swingworker JP进程栏未更新,swingworker,jprogressbar,Swingworker,Jprogressbar,您好,我想在Swing Worker类的帮助下更新我的JProgress栏。我在这个论坛上搜索了关于这个主题的其他问题,并获取了一些解决方案的代码,但在我的情况下,我不工作:(我有两个类:在第一个类中,我使用以下代码创建Swing Worker类BitMapFilterPararalGrey的对象: Greyscale.addActionListener(new ActionListener() { @Override public void actionPerf

您好,我想在Swing Worker类的帮助下更新我的JProgress栏。我在这个论坛上搜索了关于这个主题的其他问题,并获取了一些解决方案的代码,但在我的情况下,我不工作:(我有两个类:在第一个类中,我使用以下代码创建Swing Worker类BitMapFilterPararalGrey的对象:

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();

        }
    });
Greyscale.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件evt){
int numThreads=Runtime.getRuntime().availableProcessors();
int HeightPerThread=image.getHeight()/numThreads;
BitmapFilterParallelGrey[]bitmapFilter=新的BitmapFilterParallelGrey[numThreads];
int startRow=0,endRow=0;
对于(int i=0;i
由于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;
}


}
公共类BitmapFilterParallelGrey扩展SwingWorker{
缓冲图像;
斯特罗私人酒店;
公共位图过滤器Parallelgrey(BuffereImage图像、int startRow、int endRow){
这个图像=图像;
this.startRow=startRow;
this.endRow=endRow;
}
@凌驾
public Void doInBackground()引发异常{
int width=image.getWidth();

对于(inti=startRow;i我可以想出几个可能会给您带来有趣结果的原因。其中一个原因可能与您的
抛出异常有关{
。您是否尝试过检查是否抛出了任何未捕获的异常?我对Java还是相当陌生,我自己的工作才编写了几周,所以我仍然不熟悉Java可以自行修复什么和不能修复什么。还有一些其他可以做到这一点的事情

setProgress(int值);

假设进度条的值介于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在事件调度线程上得到异步通知,因此在调用任何PropertyChangeListeners之前,可能会发生对setProgress方法的多次调用。出于性能目的,所有这些调用都会合并为一次调用,仅使用最后一个调用参数

我希望我已经理解了您的代码,能够对您有所帮助