3

我实际上是 Java 和 SWT 的新手,所以我的问题可能听起来很愚蠢。我已经查看了 intrnet(和 stackoverflow),但是对于像我这样的菜鸟来说,所有的答案和示例都太复杂了。

我有一门课,叫它管理员。当我单击一个按钮时,它会在另一个类(处理程序)中启动一个方法。

  1. 在 Admin 中,我有一个进度条,它应该随着 Handler 中的操作而增加。
  2. 我不知道 Handler 中的操作需要多少时间,但我知道我有 9 个。
  3. 我想以某种方式在每种方法完成时通知管理员。

到目前为止我所拥有的:(省略了非相关部分)

管理员.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);
                        }
                    });
                }
            }
        };

处理程序.java:

public class Handler implements Runnable{

void m1() {...}
void m2() {...}
...
void m9() {...}

public void run()
{
 m1();
 m2();
 ...
 m9();

}

通过这个实现,对 handler.run() 的调用可以正常工作,并且进度条正在填充,但当然它们无论如何都不是“相关的”。

我会感谢你的智慧!非常感谢!

4

2 回答 2

1

解决这个问题的高度耦合方法是在构造函数中将HandleraProgressBar作为输入,m1()完成后将进度更新为 1/9,依此类推。一种更好(更解耦)的方法是,您可以“收听” Handler,并Handler在每个方法完成后触发一个事件及其进度。然后你可以在Admin.java.

于 2013-01-05T16:53:17.510 回答
1

ProgressMonitorDialog如果将此库添加到您的应用程序不是什么大问题,我会要求您考虑使用JFace。您的代码将如下所示:

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*方法中,以获得更详细的报告。在将它们发送到每种方法之前,请查看将初始 9 个刻度中的SubProgressMonitor一个进一步划分。m*

但这意味着您的进度条是一个新对话框,您可能无法接受,因此在这种情况下,第一个答案适合您的需求。

于 2013-01-08T11:04:19.887 回答