我正在尝试更新进度条,但我做不到。我的代码是这样的:
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
在做什么。