サーバーから N 個の要素をダウンロードする Java プログラムを作成しています。「既にダウンロードされた要素」/N パーセンテージを示す作業進行状況バーが必要です。現在、スレッドに GUI オブジェクトへの参照を渡してプログレスバーの値を更新していますが、コードが「醜い」ものになります (GUI クラスは、GUI 自体への参照を含むスレッドを作成し、一種のループを作成します)。それを行うより良い方法はありますか?
4 に答える
SwingWorker
この例で示唆されているように、このコンテキストではいくつかの利点があります。
JProgressBar API を読み、実際の例については、プログレス バーの使用方法に関する Swing チュートリアルへのリンクに従ってください。
「ループ」を取り除くために。作業スレッドに渡される、GUI が拡張するインターフェイスを作成します。
ここで役立つ設計パターンの 1 つは、リスナー パターンです。進行状況リスナーをワーカー スレッドに登録します。リスナーは、GUI (またはその他の進行状況に関心のあるもの) に投稿する責任があります。
このような状況では、複数のリスナーを使用する可能性はほとんどないため、多くの場合、リスナーを 1 つだけ使用する方が適切です (複雑さとオーバーヘッドが軽減されます)。
私のアプリでは、ProgressTracker (パーセンテージとステータス テキストの 2 つのイベント タイプがあります) を渡すことによって、長時間実行される操作が呼び出されます。この情報は、JProgressBar、JLabel などを更新するために使用されます...また、ProgressTracker を使用して、操作をキャンセルする必要があるかどうかを確認します。
SwingWorker には、複数の更新をマージするのに役立つコードがいくつかありますが、長時間実行されるタスクは SwingWorker から継承する必要があるという前提に基づいて構築されているため、関心の分離には役立ちません。どちらの方向に進むかは、実際にはあなた次第です。個人的には、自分のデータに対する操作が GUI とは無関係であることを好みます。
SwingUtilities.invokeLater() を使用して、EDT 上のすべての Swing コンポーネントに更新を投稿することを忘れないでください。