Urumaでプログレスバー

時間のかかる処理を実行しているときに応答なしになっちゃうのが嫌だったのでプログレスバーを表示しよう。

ってことでUrumaで進捗状況を表示するためのプログレスバーを早速トライ。

public class MainAction {
  public ProgressBar progress;

  @EventListener(id = "button")
  public void clickButton() {
    for( int i = 0; i < 100; i++ ){
      //時間のかかる処理
      this.progress.setSelection(i);
    }
  }
}

これでいけるだろうって思って実行したらボタンをクリックしたときの処理が短ければ(5秒〜10秒?)問題なくできるんだけど、時間がかかると応答なしになってプログレスバーが動かなくなってしまいます。

そこでいろいろ調べた結果やっぱりスレッドを使わないといけないらしい。

スレッドなんてほとんどやってなかった(Javaを勉強し始めたころにちょこっとやっただけ)ので書き方がよくわからん^^;

ちょうどいいのないかなーって調べたらSWTで似たようなことやってるのを発見><b

で、真似てみた。

public class MainAction {
  public ProgressBar progress;
  public Shell shell;

  @EventListener(id = "button")
  public void clickButton() {
    for( int i = 0; i < 100; i++ ){
      //時間のかかる処理
      this.progress.setSelection(i);
    }
  }

  public void OriginalThread imprements Runtime{
    private int index = 0;

    public void run() {
      for( index = 0; index < 100; index++ ) {
        //時間のかかる処理
        shell.getDisplay.asyncExec(new Runtime() {
          public void run() {
            progress.setSelection(index);
          }
        });
      }
    }
  }
}

コレで実行したらちゃんと動いたw

まぁshell.getDisp・・・のrun()に最初時間のかかる処理書いて最初みたいに応答なしになったけどね^^;

shell.getDisplay.asyncExec(new Runtime() {
  public void run() {
  progress.setSelection(index);
  }
});

のprogress.setSelection(index);には時間のかかる処理は書いてはいけません。(書いてもいいけど意味ないしね)