3

カプセル化されたクラスではないSwingWorkerクラスで、情報の受け渡し、進行状況の更新、および「完了」の表示に問題があります。

ハードドライブ上のファイルとディレクトリを処理する単純なクラスがあります。ユーザーが[スタート]ボタンをクリックすると、SwingWorkerのインスタンスが起動します。

プログレスバーを更新するために、SwingWorkerからのイベントドリブンスレッドのJTextAreaで処理されるファイルの名前を印刷したいと思います。Web上のすべての例はネストされたクラス用であり、ネストされたクラスは外部クラス(doneメソッドなど)の変数にアクセスします。また、EDTが[スタート]ボタンの有効化(およびフィールドのクリア)などのアクションを実行できるように、SwingWorkerが終了したことをイベントドリブンスレッドに通知したいと思います。

私の質問は次のとおり です。1。SwingWorkerクラスは、イベントドリブンスレッドのJTextAreaにテキストをどのように配置し、プログレスバーを更新しますか?

  1. EDTは、{ external } SwingWorkerスレッドがいつ終了したかをどのように判断しますか?

{多くのコード(および処理)が実行されるため、SwingWorkerをネストされたクラスとして使用したくありません。}

4

1 に答える 1

2

ASwingWorkerは、別のクラスにカプセル化されているかどうかに関係なく、ジョブを実行するために必要な情報を拡張して渡すことができるクラスです。したがってJTextArea、コンストラクターで「ターゲット テキスト エリア」として渡し、それをメンバー変数として格納し、process(List<V>)メソッドでテキスト エリアを更新することができます。

EDT は、ワーカーがいつ終了するかを判断しません。ワーカー自体は、doInBackground()メソッドが終了するため、ジョブが完了したことを認識します。ワーカーをラップするコードは、完了を検出し、EDTdoInBackground()でメソッドを呼び出します。done()(Swing Worker がスレッドのすべての変更を自動的に処理する機能は、Swing Worker が優れている点の 1 つです。)

done()実装では、オブザーバー オブジェクトを介してコールバックすることで GUI に完了を通知できます。これも、ワーカーのコンストラクターに渡すことができるものです。

さまざまなメソッドを実装する方法の説明については、SwingWorker に関するこのチュートリアルを参照してください。プログレス バーのトレイルには、swing ワーカーでのプログレス バーの使用に関するセクションが含まれています。

于 2010-04-24T00:12:35.607 に答える