Java和SWT:线程和侦听器



我实际上是Java和SWT的新手,所以我的问题可能听起来很愚蠢。我已经浏览了互联网(和stackoverflow),但所有的答案和例子对我这样的新手来说都太复杂了。

我有一个类,叫它Admin。当我单击一个按钮时,它在另一个类(Handler)中启动一个方法。

  1. 在管理我有一个进度条,应该增加与
  2. 我不知道手术要花多少时间Handler需要,但是我知道我有9个。
  3. 我想,无论如何,当每个方法完成时通知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个刻度进一步划分。

但这意味着你的进度条是一个新的对话框,你可能不接受,所以在这种情况下,第一个答案符合你的需要。

最新更新