2011-01-22 14 views
3

私はサーバーからN要素をダウンロードするJavaプログラムを構築しています。私は、 "既にダウンロードされた要素"/Nのパーセンテージを示す作業進行状況バーを持っています。今は、GUIオブジェクトへの参照をスレッドに渡すことでプログレスバーの値を更新しますが、コードは「醜い」(GUIクラスはGUI自体への参照を含むスレッドを作成し、ループの種類を作成します)。 より良い方法がありますか?ワーカースレッドからプログレスバーを更新する

答えて

5

SwingWorkerは、この文脈では、このexampleで示唆されているようにいくつかの利点があります。

2

JProgressBar APIを読み、実際の例として進捗バーを使用する方法のSwingチュートリアルへのリンクに従ってください。

+0

)SwingUtilities.invokeLaterをを(使用しEDT上の任意のSwingコンポーネントに、あなたの更新情報を投稿してください。リンクが必要です。 –

+1

@pst、リンクはAPIにあります。参照のためにAPIに簡単にアクセスできない場合は、プログラムすることはできません。 – camickr

2

"ループ"を削除するためです。 GUIが拡張して作業スレッドに渡されるインタフェースを作成します。

0

ここで使用できるデザインパターンの1つはリスナーパターンです。進捗リスナーをワーカースレッドに登録します。リスナーは、GUI(または進行中に興味のあるもの)に投稿する役割を担います。

このような状況では、複数のリスナーを持つ可能性は非常に低いため、1つのリスナーだけを持つ方が(複雑さとオーバーヘッドが少なくなります)。

私のアプリでは、長時間実行される操作は、ProgressTracker(パーセントとステータステキストの2つのイベントタイプがあります)を渡すことによって呼び出されます。この情報は、JProgressBar、JLabelなどの更新に使用されます... ProgressTrackerを使用して、操作をキャンセルする必要があるかどうかを確認します。

SwingWorkerには、複数の更新をマージするのに役立つコードがいくつかありますが、長時間実行されるタスクはSwingWorkerから継承することを前提に構築されているため、懸念の分離には役立ちません。どちらの方向に向かうのかはあなた次第です.GUIとは何の関係も持た​​ないため、自分のデータの操作を個人的に好みます。

はupvoteだろ

関連する問題