我开始使用Java GUI并且我在使用SwingWorker时遇到了一些问题:我正在尝试使用简单的UI启动服务器,运行一些“slave”对象,最后运行一个管理所有工作。我在master中定义了问题(要执行的任务的数量),并且我在UI中有一个progressBar,我想在每次完成任务时更新它。我使用SwingWorker来更新progressBar,但我不知道如何正确执行:在后台方法中它只是睡眠,直到主人在任务完成时将其唤醒。不幸的是,它不起作用,如果有人能解释我应该怎么做,我将不胜感激。
我在GUI中创建了swingworker并添加了一个用于更新progressBar的监听器:
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
worker = WorkerUpdater.getInstance();
jProgressBar1.setValue(0);
worker.addPropertyChangeListener(this);
worker.execute();
这是SwingWorker:
public class WorkerUpdater extends SwingWorker<Void, Integer> {
private static WorkerUpdater instance;
private int progress;
private boolean changed = false;
public int getProgreso(){
return this.progress;
}
public void setProgreso(int p){
this.progress = p;
changed = true;
}
public static WorkerUpdater getInstance(){
if(instance == null)
instance = new WorkerUpdater();
return instance;
}
@Override
protected Void doInBackground() throws Exception {
while(progress < 100){
if(changed){
setProgress(Math.min(progress, 100));
changed = false;
}
}
return null;
}
}
我希望在其他类(客户端)完成任务时更新进度条的值:
public boolean taskIsDone(String taskID, Object[] retVal) throws RemoteException {
System.out.println("Client: taskIsDone(): Old task: " + taskID);
this.doneTasks++;
this.progress = ((Double) Math.ceil(doneTasks / totalTasks)).intValue();
synchronized (taskSynch) {
worker.setProgress(progress);
this.results.put(taskID, retVal);
task_count--;
taskSynch.notify();
}
System.out.println("Client: Task finished: " + taskID);
return true;
}
问题是客户端类中的进度值会更改其值,但进度条不会。