我正在尝试更新进度条,但我做不到。我的代码是这样的:

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()

谢谢!

最佳答案

您需要的是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在做什么。

09-27 15:00