我的应用程序由进度条和状态标签组成。进度条应显示进程的更新,标签应显示一条消息,通知用户正在执行的进程。
我的应用程序将查询将插入我的电脑的读卡器。当检测到阅读器时,将开始轮询呈现给阅读器的卡。我想执行一个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);
}
}