Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将swingWorker与其他类一起使用_Java_Swing_Swingworker_Jprogressbar - Fatal编程技术网

Java 将swingWorker与其他类一起使用

Java 将swingWorker与其他类一起使用,java,swing,swingworker,jprogressbar,Java,Swing,Swingworker,Jprogressbar,我开始使用Java GUI,但SwingWorker有一些问题:我尝试使用一个简单的UI来启动服务器,运行一些“从属”对象,最后运行一个主对象来管理所有工作。我在master中定义了问题(要做的任务数量),并且在UI中有一个progressBar,我希望在每次任务完成时更新它。我使用SwingWorker来更新progressBar,但我不知道如何正确操作:在background方法中,它只是休眠,直到任务完成后主程序将其唤醒。不幸的是,它不起作用,如果有人能解释我该怎么做,我将不胜感激 我在G

我开始使用Java GUI,但SwingWorker有一些问题:我尝试使用一个简单的UI来启动服务器,运行一些“从属”对象,最后运行一个主对象来管理所有工作。我在master中定义了问题(要做的任务数量),并且在UI中有一个progressBar,我希望在每次任务完成时更新它。我使用SwingWorker来更新progressBar,但我不知道如何正确操作:在background方法中,它只是休眠,直到任务完成后主程序将其唤醒。不幸的是,它不起作用,如果有人能解释我该怎么做,我将不胜感激

我在GUI中创建swingworker,并为更新进度条添加一个侦听器:

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;
    }

}

问题是,客户端类中的进度值会更改其值,但进度条不会更改。如果您发布了一个SSCCE,说明您遇到了什么样的问题,这会很有帮助。进度条不会自动更新。您必须对其调用
setValue
。除了设置为0之外,我看不到您正在这样做。此外,您的代码不是线程安全的。特别是,HotSpot可能能够将
if(changed)
编译为
if(false)
,因为
changed
不是易失性的。我忘了输入方法,但我有一个“propertyChange”,它不起作用。
    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;
    }