我正在尝试更新进度条而我无法执行此操作。我的代码是这样的:
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()
}
谢谢!
答案 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));
}
}
的一个例子
现在,如果您无法修改longMethod
,那么您无法更新进度,因为您无法知道longMethod
正在做什么... < / p>
答案 1 :(得分:-1)
如果有办法将进度条传递给SwingWorker,那么SwingWorker会引用该进度条并能够更新它。