2017-12-01 2 views
1

私は16枚のパズルアプリケーションの解をアニメーション化しようとしています。私はTimerクラスの使い方の提案をしています。現在のところ、アニメーションは非常に高速に実行され、最終状態のみが表示されます。私は3000msに遅延を増やしてみましたが、結果は同じでした。Java遅延フレームの再塗りつぶし

public void animateSolution(Node node) 
{ 
    Stack<Node> solution = new Stack<>(); 

    while (node != null) 
    { 
     solution.push(node); 
     node = node.getParent(); 
    } 


    while (!solution.isEmpty()) 
    { 
     Node current = solution.pop(); 

     Timer timer = new Timer(750, new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       moveBuilder(current); 
       repaint(); 

      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 
} 

答えて

1

ループの繰り返しごとに異なるTimerを作成したくない場合があります。 solutionで動作するように、この匿名クラスのために、あなたはfinalとしてsolutionを宣言しなければならないこと

Timer timer = new Timer(750, new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(!solution.isEmpty()){ 

      Node current = solution.pop(); 
      moveBuilder(current); 
      repaint(); 
     } 


    } 
}); 

timer.setRepeats(true); 
timer.start(); 

注:

は、単一Timerを使用して第二whileループを取り除くため、例えばのように考えてみましょう

final Stack<Node> solution = new Stack<>(); 
+0

ありがとうございます。実際にはソリューションの最終化なしでも機能しました。 –