如何使用不同的SwingWorker更新进度条

时间:2017-09-20 13:02:20

标签: java multithreading

我的应用程序由进度条和状态标签组成。进度条应显示进程的更新,标签应显示一条消息,通知用户正在执行的进程。

我的应用程序将查询将插入我的电脑的读卡器。当检测到阅读器时,将开始轮询呈现给阅读器的卡。我想执行一个swingWorker用于读取器轮询,另一个用于卡片轮询。轮询期间应更新进度条。当没有检测到读卡器或卡时,进度条应暂停,直到应用程序检测到读卡器或卡。当检测到卡时,应用程序将访问该卡将进行一些交易。我不知道如何更新或计算进度,以便正确更新进度条。这就是我到目前为止所做的。

public static void main(String[] args) 
    {   

        startReaderPolling();
    }

public void startReaderPolling()
    {

        try
        {           
            readerPolling = new ReaderPolling();    
            readerPolling.addPropertyChangeListener(this);
            readerPolling.execute();



        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }


public class ReaderPolling extends SwingWorker<Void, String>
    {       
        @Override
        protected Void doInBackground() throws Exception 
        {                       
            try
            {   
                AccessController.doPrivileged( new PrivilegedExceptionAction<Boolean>()
                {
                    public Boolean run()
                    {
                        while (!isCancelled())
                        {
                            try                         
                            { 
                                if(isReaderStatusChanged())
                                {
                                    if(isReaderDetected)
                                    {
                                        publish("Reader detected");
                                    }
                                    else
                                    {
                                        publish("No reader");
                                    }

                                }
                            }
                            catch(CardNotPresentException ex)
                            {

                                ex.printStackTrace();
                            }
                            catch(CardException ex)
                            {
                                ex.printStackTrace();
                            }
                            catch (Exception ex)
                            {                               

                                ex.printStackTrace();

                            }
                        }
                        return null;
                    }
                });

                return null;
            }       
            catch(PrivilegedActionException ex)
            {   
                ex.printStackTrace();
                return null;
            }
        }

        @Override
        protected void process(List<String> chunks)
        {
            lblStatus.setText(chunks.get(chunks.size() - 1));
        }

        @Override
        protected void done()
        {
            try {
                get();
            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            lblStatus.setText("done");
        }
    }

    /**
     * Invoked when task's progress property changes.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            ProgressBarProgress.setValue(progress);

        } 
    }

0 个答案:

没有答案