Java Swingworker在propertyChangeListener处于100处停止工作

时间:2015-03-02 16:00:45

标签: java image swingworker

我还在构建测试图像的程序。为了更新GUI我做了一个swingworker并且他工作正常,直到我达到101个选定文件的神奇数量 我需要在一个目录中测试数百个图像,并且不想将它们分别用于101个图像的块。所以有人有一个想法,为什么它停止工作而不激活完成方法?
为了更清楚地说明:
测试Img 1,测试Img 2,....测试Img X(x <= 100),测试Img 101停止,没有测试或完成或错误Img 102(只是没有进展)只有消息我可以找到ist that that PropertyChangeEvent点击&#34; DONE&#34; 101个测试图像后。但该属性仍应更改,progressBar显示99%,popUp显示101/102。 (使用数字测试到100都可以正常工作并在结束时显示100%和100/100,而我的日志收到消息&#34; DONE&#34;!

我用这个工人更新的是progressBar和带有当前%(progressBar)和当前图像(例如101/110)的popUp
这是摆动工作者本身:

private void work(final File filex)
{


    worker = new SwingWorker<Void, Integer>()
    {
        @Override
        protected Void doInBackground() throws Exception                
        {
            File file = filex;

            if (file.isDirectory()) 
            {

                File[] listOfFiles = file.listFiles();
                iMax=listOfFiles.length;
                for (i= 0; i< iMax; i++) 
                {
                    aktionenTest(listOfFiles[i]);                                   //processing/working here
                    setProgress(i);
                } 
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

            } 
            else 
            {
                iMax = 1;
                i = 1;
                aktionenTest(file);                                                     
                setProgress(i);
            }



            return null;


        }

        @Override
        protected void process(List<Integer> chunks)
        {

        }

        @Override
        protected void done()
        {
            if(worker.isCancelled())
            {
                log.append("Cancelled!");
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
            else
            {
                log.append("DONE");

            }
        }

    };
    worker.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent event) {
            System.err.println(event);
            log.append(""+event+newline);
            if(event.getPropertyName().trim().equals("progress"))
            {
                if(event.getOldValue().equals(0))
                {
                    popupCounter((Integer) event.getNewValue());
                } 
                if(iMax == 1)
                {
                    maxProg = iMax;
                    curProg = ((Integer) event.getNewValue())*100/maxProg;

                    progressBar.setValue(curProg);     
                    popupUpdate((Integer) event.getNewValue());
                }
                else
                {
                    maxProg = iMax;
                    curProg = (((Integer) event.getNewValue()+1))*100/maxProg;

                    progressBar.setValue(curProg);     
                    popupUpdate((Integer) event.getNewValue());
                }
            }


        }
    });

    worker.execute();
}

这里是101之前的PropertyEvent的输出

java.beans.PropertyChangeEvent[propertyName=progress; oldValue=99; newValue=100; propagationId=null; source=components.Bilderexplorer$4@79885c3a]

和101之后(但仍有Img 102)

java.beans.PropertyChangeEvent[propertyName=state; oldValue=STARTED; newValue=DONE; propagationId=null; source=components.Bilderexplorer$4@79885c3a]  

所以有人知道问题是什么吗?也许我从我自己的代码中找到了代码盲。

迎接并感谢 Zorian

1 个答案:

答案 0 :(得分:1)

当您使用i&gt; 100致电setProgress(i)时,它会抛出

new IllegalArgumentException("the value should be from 0 to 100");

您可以使用setProgress(i*100/iMax)

之类的内容替换它

异常永远不会被捕获,只会导致线程异常停止。