2017-04-15 6 views
0

私は多くの検索をしています。問題の解決策を見つけることができません。 JavaのJFrameを使ってGUIを設計するのは簡単ですが、setText以外の呼び出しで視覚的に更新するのははるかに面倒です。特に、視覚的な認識のための待ち時間をシミュレートする場合にはそうです。私はマルチスレッドと私が見つけたソリューションのすべてに精通していないので、私はそれらを必要とした方法を働かせることができなかったようです。Java - 変化する画像をシミュレートするためのスリーピングスレッド

私がやっていることは、シンプルなサイコロゲームのために特定の面に着陸する前にサイコロを振ることです。これを行うために、私はちょうど何分の1秒(この場合は150ミリ秒)ごとに設定された回数(例えば10回)サイコロ画像の異なる面を切り替えるだけです。

興味深いのは、現在の状態のこのコードは、起動時にどのようにして正しく動作するかです(ユーザ入力を受け入れる前に10回のロールサイクルを1回実行しますが、GUIのすべてのコンポーネントが表示されます期待通りに働く)。問題は、再ローリング時に、すべてのスレッドスリープが完了するまでGUIがブランクになることです。

このようなことについての私の知識が不足しているため、最初にやりたいことがどうしてうまくいくのか理解できません。うまくいけば、私はこれを達成するための正しい方法や私が現在やっていることに対する修正を得ることができます。ありがとう!

private void rollDice() 
{   
    for(int i = 0; i < 10; i++) 
    { 
     dice1 = (int) (Math.random() * 6) + 1; 
     dice2 = (int) (Math.random() * 6) + 1; 

     img1 = new ImageIcon(dice1 + ".png"); 
     img2 = new ImageIcon(dice2 + ".png"); 

     try 
     { 
      Thread.sleep(150); 
     } 
     catch(Exception e) 
     { 

     } 

     lbl1.setIcon(img1); 
     lbl2.setIcon(img2); 
    } 
} 
+0

JavaFxに切り替えます。 – Sedrick

+0

あなたの問題は、メインスレッド上でforループを実行しているため、GUIがフリーズしてしまうことです。 – Sedrick

+0

@SedrickJefferson私は、これはJavaの割り当てのためのものです – Charles

答えて

0

これを試してみると、hereが見つかりました。

new Thread(new Runnable 
{ 
    public void run() 
    { 
     for(int count = 0; count < PREROLLS; count++) 
     { 
      //Add your for loop logic here! 

      SwingUtilities.invokeLater(new Runnable() { 
       public void run() 
       { 
         //then update you icon here. I would start with one die if I were you. 
         imgDice1 = new ImageIcon(path + dice1 + ".png"); 
       } 
      }); 
      try { Thread.sleep(100); } catch(Exception e) {} 
     } 
    } 
}).start(); 
+0

私はこの答えで私の問題を解決することはできませんでしたが(何か間違っている可能性があります)、あなたの前のコメントは、私が望んだことをした解決策を見つけるのを助けました。基本的には、私がしたのは次の通りです: 新しいスレッド(){public void run(){/ *すべての以前のダイスロールコード+スレッド終了コード* /}} .start(); あなたの答えよりずっと簡単ですが、私の必要と同じように機能します。ありがとう! – Charles

+0

@Charlesこれは良い解決策ではありません、あなたがしたいことを達成するために、スイングタイマーやスイングワーカーを見てみる必要があります – nachokk

+0

実際には、そうでない場合は、この答えを正しく受け入れるべきではありません。私はこの答えを削除することができ、問題を解決するために行ったことを投稿することができます。そうすれば、将来の誰かが同じ問題を抱えていれば、良い答えを得ることができます。 – Sedrick

関連する問題