2011-12-11 9 views
2

私が取り組んでいる課題に何らかの問題があります。Jlabelの画像を更新するときに奇妙な問題が発生する

その一部は、ダイのペアのローリングをアニメートすることです。私は、各側面の1つである6つのJPEGSを持っています。ローリングの代わりに、私はそれが画像を循環するようにしたい。私はループで何度もsetIconを使用しようとしており、遅延のためにThread.sleep()を使用しています。これは、とりわけ、ユーザーがボタン(イベント)を押すと発生します。画像を表示する代わりに、正しい時間だけ待ち、最後の画像のみを表示します。ここで私はループを実行するために呼んでいる機能です:

private void aniRoll(){ 
    for(int i = 0; i < 10; i++){ 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg"))); 
     try{ 
      Thread.sleep(1000); // Sleep for 1 sec 
     } 
     catch(InterruptedException e){} 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg"))); 
     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e){} 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg"))); 
     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e){} 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg"))); 
     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e){} 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg"))); 
     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e){} 
     die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg"))); 
     try{ 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e){} 

    } 

}

をdie1Dispは私のJLabel、aniRoll(の名前です)が、私はので、プライベート作られた(ループを実行するために呼んでいる機能です私はGUIクラスの外にそれを呼びたくはありません)、faceX.jpgは私の画像です。

私が理解できないことは、Thread.sleep()をどこに置いても最初にプログラムを遅らせてから最後の画像しか表示しないことです。例:

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg"))); 

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg"))); 

//bunch of extra code 

try{ 
    Thread.sleep(10000); // Sleep for 10 sec 
} 
catch(InterruptedException e){} 

これは10秒間待ってから2番目の画像のみを表示します。それは最初のものをすばやくすばやく表示せず、2番目の画像を表示してから待機し、2番目の画像のみを表示します。この奇妙なことは本当に私を困惑させました。私はそれを修正する方法がわかりません。私はエディタとしてNetBeans IDE 7.01を使用しています。基本的なレイアウトとコード生成ではコンポーネントパレットを使用しています。

--Thanks

答えて

3

まずあなたはGUIスレッドに変更を加える必要があります。

SwingUtils.invokeLaterを参照してください。

また、Thread.sleepはそれをカットしません。アイコンを切り替えるタイミングを指定するには、javax.swing.Timerを使用する必要があります。

+0

ありがとう、これは間違いなく正しい道に私を置いてくれました。私が数時間で作った最初の本当の進歩。さて、それをイメージを通して循環させる方法を理解するだけです.... –

1

イベントを管理して再描画(画面の更新)するUIスレッドが1つあります。あなたはそれを寝かせます。そうすることは、起きるまで(UIに関して)何も起こらないことを意味します。

actionPerformedメソッドで、再描画を行う新しいスレッドを開始します。それはそれを修正する必要があります。

関連する問題