2016-03-25 10 views
0

私は、タイマーがゼロになるまでにある時点に達していないと終了するゲームを作成しています。現在は動作しており、一度に複数のTimerTaskを作成できますが、キャンセルはできません。現在のところ、ボタンをクリックすると(ディスプレイ上の)タイマーはリセットされますが、バックグラウンドで実行され、ゼロになった時点でプログラムが終了します(実行してはいけないにもかかわらず)。各タイマーを開始するActionListenerのコードは次のとおりです。Javaで特定のTimerTaskをキャンセルできますか?

public class Game implements Runnable { 

    private int currentScore, difficulty, level, highscore, x, y; 
    private boolean playMusic, playClicks, gameRunning; 
    private boolean stopLastTimer = false; 
    JFrame gameFrame; 
    Data data; 
    JButton target; 
    Thread t; 
    JLabel score; 
    Timer globalTimer = new Timer(); 
    JLabel timer; 

    ActionListener clickedAction = new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) { 
       stopLastTimer = true; 
       t.interrupt(); 
       currentScore++; 
       score.setText("Score: " + currentScore); 
       //playClickSound(); 
       globalTimer.schedule(new TimerTask(){ 

        double second = 2.0; 
        @Override 
        public void run() { 
         second = second - 0.1; 
         if(stopLastTimer) { 
         this.cancel(); stopLastTimer = false; } //should end old timer here 
         if(second == 0.0) { 
         this.cancel(); 
         gameStop(); 
         } 
         second = limitPrecision(Double.toString(second), 1); 
        timer.setText(second + "s"); 
        } 
       },0, 100); 

      } 
     }; 

答えて

2

TimerTaskを使用しないでください。

代わりにアニメーションにjavax.swing.Timerを使用する必要があります。 Swing Timerにはstop()メソッドがあります。

ActionEventのソースはタイマーそのものになります。

詳細と動作例については、How to Use TimerのSwingチュートリアルのセクションをお読みください。

+0

どうすればよいですか?私はAPIを読んでコードを試しましたが、この状況で使用するタイプのようには見えません。私はカウントダウンを表示することさえできません。 –

+0

概念はAWT Timerと同じですが、Event Dispatch ThreadでSwingコンポーネントが適切に更新されるようにSwingで使用されます。タイマーが発生するすべてのタイマーは、1つずつ減少します。秒が0に達するとタイマーが停止します。ロジックは、run()メソッドの代わりにActionListenerのactionPerformed()メソッドのコードを除いて現在のものと同じです。ここに簡単な例があります。http://stackoverflow.com/questions/30417719/update-a-label-with-a-swing-timer/30417857#30417857 – camickr

関連する問題