2016-03-25 14 views
0

Zamanlayıcı sıfıra ulaştığında belirli bir noktaya ulaşmadıysanız sona eren bir oyun oluşturuyorum. Şu anda çalışıyor ve bir kerede birden çok TimerTask oluşturabilirim, ancak bunları iptal edemiyorum. Şu anda, düğmesine tıklamak zamanlayıcıyı (ekran üzerinde) sıfırlar ancak yine de arka planda çalışır ve programı sıfıra ulaştığında sonlandırır (çalışmamasına rağmen). İşte her zamanlayıcıyı başlatan ActionListener için kod.Java'da belirli bir TimerTask'ı iptal edebilir misiniz?

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); 

      } 
     }; 

cevap

2

Bir TimerTask kullanmayın. Animasyon için javax.swing.Timer kullanıyor olmalısınız. Bir Swing Timer, stop() yöntemine sahiptir.

ActionEvent öğesinin kaynağı Zamanlayıcı'nın kendisi olacaktır.

Daha fazla bilgi ve çalışma örnekleri için How to Use Timer numaralı Swing öğreticisinden bölümü okuyun.

+0

Bunu nasıl yaparım? API'yi okudum ve kodu denedim ama bu durum için kullanacağım şeyin türü gibi görünmüyor. Geri sayımı gösteremiyorum bile. –

+0

Bu kavram bir AWT Zamanlayıcısı ile aynıdır, ancak Swing ile birlikte Swing bileşenlerinin Olay Sevk İpliği'nde doğru şekilde güncellenmesi için kullanılır. Zamanlayıcının ateşlediği her zamanlayıcı, saniyeyi bir azalır. Saniye 0'a ulaştığında, Zamanlayıcıyı durdurursunuz. Mantık, farklı bir durumda o anda geçerli olanı, bir run() yöntemi yerine bir ActionListener öğesinin actionPerformed() yöntemindeki kod haricinde yoktur. İşte başlamanız için basit bir örnek: http://stackoverflow.com/questions/30417719/update-a-label-with-a-swing-timer/30417857#30417857 – camickr

İlgili konular