簡體   English   中英

Java Swingworker在100的propertyChangeListener處停止工作

[英]Java Swingworker stops working at propertyChangeListener at 100

我仍在構建程序來測試圖像。 為了更新GUI,我做了一個搖擺工,他工作得很好,直到我擊中了101個選定文件的神奇數目。
我需要在一個目錄中測試數百張圖像,並且不想將它們分割成101張圖像的塊。 那么,有誰知道,為什么不激活完成的方法就停止工作?
為了使其更清楚:
測試圖1,測試圖2,....測試圖X(x <= 100),測試圖101停止,沒有測試或完成或錯誤圖102(只是不進行)僅消息我可以發現PropertyChangeEvent經過101張測試圖像后,點擊“完成”。 但是該屬性仍應更改,並且progressBar顯示99%,彈出窗口顯示101/102。 (測試直到100的數字都可以正常工作,並在日志顯示消息“ DONE”時顯示在100%和100/100的末尾!

我使用此工作程序更新的是一個progressBar和一個帶有當前%(progressBar)和當前圖像(eg101 / 110)的彈出窗口
這是秋千工人本身:

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(但仍然有102圖)

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

那么,有人對這個問題有一個想法嗎? 也許我對自己的代碼太盲目找不到。

問候和感謝
Zorian

當您使用i> 100調用setProgress(i) ,它將拋出

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

您可以將其替換為setProgress(i*100/iMax)

永遠不會捕獲該異常,而只會導致線程異常停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM