我实际上是Java和SWT的新手,所以我的问题可能听起来很愚蠢。我已经浏览了互联网(和stackoverflow),但所有的答案和例子对我这样的新手来说都太复杂了。
我有一个类,叫它Admin。当我单击一个按钮时,它在另一个类(Handler)中启动一个方法。
- 在管理我有一个进度条,应该增加与 我不知道手术要花多少时间Handler需要,但是我知道我有9个。
- 我想,无论如何,当每个方法完成时通知Admin。
目前为止我所知道的:(省略了不相关的部分)
Admin.java:
ProgressBar bar = new ProgressBar(this, SWT.SMOOTH);
Button btn = new Button(this, SWT.NONE);
btn.setText("Update");
btn.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
btn.setEnabled(false);
thread.start();
}
});
Handler handler = new Handler();
final Thread thread = new Thread(){
public void run() {
handler.run();
for(int i=0; i<=10; i++) {
final int value = i;
try {
Thread.sleep(800);
} catch (Exception e) { }
display.asyncExec(new Runnable(){
public void run() {
bar.setSelection(value);
}
});
}
}
};
Handler.java:
public class Handler implements Runnable{
void m1() {...}
void m2() {...}
...
void m9() {...}
public void run()
{
m1();
m2();
...
m9();
}
通过这个实现,调用handler.run()工作得很好,并且进度条正在填充,但当然它们在任何方面都不是"相关的"。
我将感激你的智慧!非常感谢!解决这个问题的高耦合方法是让Handler
在构造函数中以ProgressBar
作为输入,在m1()
完成后,它将进度更新为1/9,以此类推。一种更好的(更解耦的)方法是,您可以"监听"Handler
,并且Handler
在每个方法完成后用其进度触发一个事件。然后您可以在Admin.java
中进行更新。
如果将这个库添加到您的应用程序中不是太大的问题,我将要求您考虑使用JFace的ProgressMonitorDialog
。你的代码看起来像下面这样:
ProgressMonitorDialog dialog = new ProgressMonitorDialog(parent);
dialog.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
monitor.beginTask("my work", 9);
m1();
monitor.worked(1);
m2();
monitor.worked(1);
...
m9();
monitor.done;
}
});
您还可以将monitor
实例发送到m*
方法中以获得更详细的报告。看看SubProgressMonitor
,在将它们发送到每个m*
方法之前,将每个的初始9个刻度进一步划分。
但这意味着你的进度条是一个新的对话框,你可能不接受,所以在这种情况下,第一个答案符合你的需要。