将swingWorker与其他类一起使用

时间:2014-03-24 16:39:35

标签: java swing swingworker jprogressbar

我开始使用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;
    }

问题是客户端类中的进度值会更改其值,但进度条不会。

0 个答案:

没有答案