3

この問題に関してすでにたくさんの質問と回答が投稿されていることは知っていますが、私の状況には少しひねりがあると思います。JFrame内にJPanelがあります。Jpanelには、ネットワークマップのペイントされた画像の背景があります。MigLayoutを使用してレイアウトを作成しました。このレイアウトのセル内に、URLから取得した画像を表示したいと思います。ひねりは、私のプロジェクトのさらに下で、5秒程度ごとにその画像を更新できるようにしたいということです。

そうは言っても、後で5秒ごとに画像を更新するプロジェクトを簡単に行えるようにするために、画像を追加する際に追求すべき特定の方法はありますか?

必要な追加情報が不足している場合は、お知らせください。

4

3 に答える 3

5

JLabel のグリッドを使用し、必要に応じて JLabelsetIcon(Icon icon)メソッドを使用して ImageIcon を交換することを検討してください。このようなことを 5 秒ごとに行うには、Swing Timer の使用を検討してください。または、xxx 秒ごとにイメージをダウンロードする場合は、SwingWorker<Void, ImageIcon>.

これで問題が解決しない場合は、行き詰まっている可能性がある場所を正確に指定してください。

于 2012-08-08T22:34:49.903 に答える
4

HovercraftFullOfEels の提案を拡張して、カスタム(この場合はComponentおそらく a ) を作成します。JLabel

ダウンロード要求を実行する in eachを使用し、javax.swing.Timer5 秒ごとに繰り返すように設定します。ここでの問題は次のとおりです。

  1. 多くの画像があり、各コンポーネントが個別のダウンロードを要求している場合、システム リソースが枯渇する可能性があります。
  2. 各イメージのダウンにかかる時間は、5 秒より長くかかる場合があります。その場合、あなたはどうしますか?

もう 1 つのアプローチは、ダウンロード要求の処理を担当する集中キューを用意することです。これは自動化 (つまり、ユーザーを登録Componentし、いつ更新するかを決定する) することも、必要に応じて要求を追加することもできます。

自動化モデルでは、リソース管理をより細かく制御できます。

この場合、 ScheduledExecutorServiceのようなものを使用してダウンロード タスクを管理したくなるでしょう。基本的な考え方は、将来の特定の時間 (5 秒) にダウンロード タスクが実行され、イメージがダウンロードされて に適用Componentされ、新しいダウンロード リクエストが に登録されるというものです。ScheduledExecutorService

このアプローチにより、システムによって作成されたスレッドの数を制御したり、リクエスト間の時間を変更したりできます。

ばかげたモデルでは、javax.swing.Timer& の組み合わせを使用する可能があります。タイマーは各 に関連付けられ、起動すると、新しい要求がダム キューに置かれます。ダム キューは、将来のある時点でイメージをダウンロードし、.ComponentComponent

これに関する主な問題は、前の要求が完了する前に、コンポーネントが新しいイメージを要求する可能性があることです。これらの状態をトラップするために使用できる手法はありますが、スマート キューのアイデアを使用する方が簡単で簡単です。

これらのアイデアはすべて Java の機能を利用しています。この場合、イベント ディスパッチ スレッドとSwing で同時実行を処理する方法をThread理解することが非常に重要です。

于 2012-08-08T23:22:49.443 に答える
2

「5 秒の画像」が「ネットワーク ステータスの更新」などを示している場合、アプリは. 更新をテキスト(またはオブジェクトなど)として取得してから、適切な画像を作成し、必要に応じて再描画を呼び出す方がおそらく良いでしょう(帯域幅の観点から、画像のキャッシュを回避するため)。

于 2012-08-09T00:59:29.130 に答える