如何从SwingWorker中的方法更新进度条

时间:2014-07-24 22:49:42

标签: java swing swingworker jprogressbar

我正在尝试更新进度条而我无法执行此操作。我的代码是这样的:

public class MyWorker extends SwingWorker<Void, Void> {

    public Void doInBackground(){
        howMany=Integer.parseInt(textField.getText());
        String result=longMethod(howMany);
        label.setText("Hello, you have "+result);
 }
}

        public class Event implements ActionListener{
    public void actionPerformed(ActionEvent e){
        label2.setText("Whatever");     
        button.setEnabled(false);
        myWorer.addPropertyChangeListener(this);
        myWorker.execute();
    }

    public void propertyChange(PropertyChangeEvent event){
        if("progress".equals(event.getPropertyName())){
           int currentPercent = (int)event.getNewValue();
            progressBar.setValue(currentPercent);
        }
    }
}

所以我无法在setProgress中使用doInBackground,因为更新是由longMethod()进行的,这是一个包含大慢速循环的方法,放在另一个类中。我已经做了类似的事情从该方法传递一个变量到包含JFrame的类,然后提供了在单击另一个按钮时看到进度的可能性。

我不知道是否有某种方法可以让该按钮(或文本字段)每隔X秒刷新一次而不点击它或使用方法setProgress的方法longMethod() }

谢谢!

2 个答案:

答案 0 :(得分:2)

您需要的是longMethod返回进度信息的方法。

例如,您可以创建一个简单的interface,您可以将其传递给longMethod,当它知道时,会更新进度...

public interface ProgressMonitor {
    /**
     * Passes the progress of between 0-1
     */
    public void progressUpdated(double progress);
}

然后在doInBackground方法中,您将ProgressMonitor的实例传递给longMethod

public class MyWorker extends SwingWorker<Integer, Integer> {
    public Integer doInBackground(){
        // It would be better to have obtained this value before
        // doInBackground is called, but that's just me...
        howMany=Integer.parseInt(textField.getText());
        String result=longMethod(howMany, new ProgressMonitor() {
            public void progressUpdated(double progress) {
                setProgress((int)(progress * 100));
            }
        });
        //label.setText("Hello, you have "+result);
        publish(result);
        return result;
    }

    protected void process(List<Integer> chunks) {
        label.setText("Hello, you have "+chunks.get(chunks.size() - 1));
    }
}

这是observer pattern

的一个例子

现在,如果您无法修改longMethod,那么您无法更新进度,因为您无法知道longMethod正在做什么... < / p>

答案 1 :(得分:-1)

如果有办法将进度条传递给SwingWorker,那么SwingWorker会引用该进度条并能够更新它。