Во-первых, я бы порекомендовал, определив концепцию «прогрессирующего» состояния
public interface Progressable {
public void setProgress(int progress); // I prefer double, but we'll keep it inline with the rest of the API
}
Затем точка входа для ваших задач будет иметь ссылку на Progressable
public class MySuperAwesomeLongRunningTask ... {
//...
private Progressable progressable;
public void performTask(Progressable progressable) {
this.prgressable = progressable
}
protected void methodThatDoesSomeWork() {
// Do some super duper work...
// calculate the progress of that work some how,
// based on your implementation...
int progress = ...;
progressable.setProgress(progress);
}
}
Затем создайте SwingWorker
, который реализует Progressable
и вызывает вашу работу ...
class Task extends SwingWorker<Void, Void> implements Progressable {
private MySuperAwesomeLongRunningTask taskToBeDone;
public Task(MySuperAwesomeLongRunningTask taskToBeDone) {
self.taskToBeDone = taskToBeDone;
}
/*
* Main task. Executed in background thread.
*/
@Override
public Void doInBackground() {
taskToBeDone.performTask(this);
return null;
}
/*
* Executed in event dispatch thread
*/
public void done() {
// What ever you need to do...
}
}
Теперь, поскольку SwingWorker
уже имеет метод с именем setProgress(int)
, он автоматически соответствует Progressable
(до тех пор, пока вы его реализуете), поэтому, когда MySuperAwesomeLongRunningTask
вызывает setProgress
, он фактически будет вызывать реализацию SwingWorker
s.
Это означает, что остальная часть кода в основном остаетсято же самое, ожидайте, я бы изменил
if ("progress" == evt.getPropertyName()) {
на
if ("progress".equals(evt.getPropertyName())) {
, потому что сравнение String
s с ==
- плохая идея (и пугает меня: P)