0

以下は、期待どおりに Java GUI を更新しなかった SwingWorker インスタンスです。

SwingWorker は、ボタンのアクション リスナー内に実装されます。ループを定義するminmaxはどちらも、アクション リスナーに対してローカルな「最終的な int」です。

SwingWorker は、反復ごとにNQueensオブジェクトの go() メソッドを呼び出し、n-queens のすべてのソリューションを再帰的に見つけることになっています。次に、NQueensオブジェクトtoString()が呼び出された後、文字列が発行され、process() メソッドが と を更新しjProgressBarますjTextArea。ただし、ボタンを押しても何も起こりません。これは、GUI コンポーネントの更新と組み合わせた集中的なプロセスを実装する方法ですか?

new SwingWorker <Void,String>()
{       
     private int totalPercent;
     @Override
     protected Void doInBackground()
     {
         int diff = max - min + 1;
         int percent = 100;
         if(diff != 0)
         {
              percent = 100/diff;
         }
         totalPercent = 0;
         NQueens queens = new NQueens(min);
         for(int j = min; j <= max; j++)
         {
              queens.go();
              totalPercent += percent;
              String newText = queens.toString();
              publish(newText);
              queens.nextSet();
         }

         isCalced = true;

         return null;
      }

      protected void process(String results)
      {
           jTextArea2.append(results);
           jProgressBar1.setValue(totalPercent);
           jProgressBar1.repaint();
      }                                 
  }.execute();  
4

1 に答える 1

0

適切なプロセス メソッドを実装していないことが原因でしょうか? プロセスの正しい署名は次のようになると思います

process(List<String> results) {
  for(String result : results) {
    jTextArea2.append(result);
  }
}

プログレスバーの更新に関して; doInBackground メソッドは別のスレッドで実行され、プロセス メソッドはワーカーを呼び出したスレッドで実行されます。doInBackground から totalPercent 変数に書き込み、process() から読み取るべきではありません。詳細については、スレッドの可視性を参照してください。代わりに、パーセント値とメッセージを保持できる ProgressUpdateEvent というクラスのようなものを作成します。そうすれば、次のようにすることができます:

new SwingWorker <Void,ProgressUpdateEvent>() {

  protected Void doInBackground() {
    for (int i = 0; i <= 100; i++) {
      publish(new ProgressUpdateEvent("At " + i + "% right now", i);
    }
  }

  protected void process(List<ProgressUpdateEvent> events) {
    for (ProgressUpdateEvent event : events) {
      jTextArea2.append(event.getMessage());
      jProgressBar1.setValue(event.getPercent());
    }
  }
}
于 2012-06-07T06:46:44.547 に答える