-1

私は本当に正しく質問したかどうか確信が持てません...そして、私が質問を適切に表現したかどうかさえわかりません..だから、前もってお詫び申し上げます...しかし、私はかなり立ち往生していますこの問題について、すべての助けに感謝します..さらに、私は率直に言って専門家ではないので...優しくしてください、私は馬鹿になろうとしているわけではありません.

だから、率直に言って、私のプログラムのポイントは、ライフラインを持つテレビの特定のゲーム番組に基づいた単純なゲームです..この特定のものは「友人に電話する」ものです.ボタン」 (実際にはJPanelを持つMouseListener)。このボタンが押されたら、アニメーション GIF (カウントダウンの) を描画し、30 秒が経過するまで他の sをロックするために機能するものは何でも、JLabelまたはJPanelを追加してペイントしたいと思います。参考までに、私は現在使用していません...JFrameComponentLayoutManager

私がこれをやろうとしてきた方法は次のとおりです。

ImageIcon CountdownImg = new ImageIcon("countdown.gif");
JLabel CountdownLbl = new JLabel(CountdownImg);
this.getContentPane().add(CountdownLbl);
CountdownLbl.setLocation(200, 200);
CountdownLbl.setSize(new Dimension(CountdownImg.getIconWidth(), CountdownImg.getIconHeight()));

long startTime = System.currentTimeMillis();
while(System.currentTimeMillis() < startTime + 30000) {
    ;
}

whileループに問題があることはわかっています。ループがなければ、画像は正常にレンダリングされます。これにより、Java は条件が満たされるまでレンダリングを待機しますCountdownLbl。また、画像を含むコンテンツ ペインを使用して別のものを作成しようとしましJFrameたが (おそらく、私自身の誤解または不十分なスレッドが原因で..)、Frame は単に表示され、そのコンテンツをレンダリングしません。実行中にスレッドがあることに気付くことがありImage Fetcherます。非常に悪いループがこのスレッドに干渉している可能性があり、このスレッドが画像のレンダリングを担当していると思います。

だから私は質問があるべきだと思います...どうすればこれを実際に実装できますか...スレッドセーフな方法で? それが正しい場合は?

あなたの時間、忍耐と努力に感謝します。

4

3 に答える 3

3

を使用しSwingWorkerて、バックグラウンドで画像をダウンロードします。このでは、1 つのコンポーネントが で更新されdone()ますがpublish()process()画像が到着したときに更新することができます。この関連するは、アプローチの概要を示しています。

于 2013-07-21T19:53:52.113 に答える
1

あなたの質問は AWT とタグ付けされているので、を使用しMediaTrackerて画像をロードすることをお勧めします。これを使用して画像が読み込まれるまで待機する方法については、ドキュメントを参照してください。

ImageIO.read(URL)を使用して取得することもできますBufferedImage

ImageIconURL からを作成するには、単にコンストラクターを使用しますImageIcon(URL)

于 2013-07-21T18:49:51.073 に答える
0

画像アイコンの描画を担当するスレッドは、あなたのケースでwhileループを実行しているスレッドと同じです.スイングUIを更新するイベントディスパッチャースレッドである EDT と呼ばれるものがあります.同じEDTを使用してカウントダウンを待っています.

このSwingUtilities.invokeLater()を調べることをお勧めします

編集:

詳細情報を追加する必要がありました:ここでは、SwingWorker と SwingUtilities の使用

于 2013-07-21T18:56:38.917 に答える