3

私は実際には Java と SWT を初めて使用するので、私の質問はばかげているように聞こえるかもしれません。私はイントラネット(およびスタックオーバーフロー)を見てきましたが、すべての答えと例は私のような初心者には複雑すぎます.

私はクラスを持っています、それを管理者と呼びます。ボタンをクリックすると、別のクラス (ハンドラー) でメソッドが起動されます。

  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);
                        }
                    });
                }
            }
        };

Handler.java:

public class Handler implements Runnable{

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

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

}

この実装では、handler.run() の呼び出しは正常に機能し、プログレス バーはいっぱいになりますが、もちろんそれらは「相関」していません。

あなたの知恵に感謝します!どうもありがとうございました!

4

2 に答える 2

1

これを解決するための高度に結合された方法は、コンストラクターの入力としてHandlertakeを取得することであり、終了後、進行状況を1/9などに更新します。それを行うためのより良い(より分離された)方法は、を「聞く」ことができ、各メソッドが終了した後に進行状況とともにイベントを発生させることです。次に、で更新できます。ProgressBarm1()HandlerHandlerAdmin.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 に答える