2016-04-10 24 views
1

java'da bir zamanlayıcı oluşturmaya ve JFrame'da göstermeye çalışıyorum ancak zamanlayıcıyı telefon zamanlayıcıma göre düzenlediğimde, telefonumdaki zamanlayıcı daha hızlı mı?Java'da bir zamanlayıcı oluşturma

Zamanlayıcıda deliği 10 saniyede bir saniyeye ayarlıyorum. kötü İngiliz

import javax.swing.Timer; 

    int min = 0, sec = 0, hundredSec = 0; 

    timer = new Timer(10, new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      hundredSec++; 

      if(hundredSec >= 99) 
      { 
       sec++; 
       hundredSec = 0; 
      } 

      if(sec >= 59) 
      { 
       min++; 
       sec = 0; 
      } 

      timerL.setText(String.format("%02d:%02d:%02d", min, sec, millisec)); 

     } 
    }); 

Maalesef:

Bu yalnızca zamanlayıcı için kodudur.

Cevabınız için şimdiden teşekkür ederiz.

+0

Java zamanlayıcı tam olarak tasarlanmamıştır. Bunun yerine, zamanlayıcının başlatıldığı zamanı kaydetmeli ve daha sonra 'actionPerformed' yönteminin mevcut saat ile başlangıç ​​zamanı arasındaki farkı hesaplamasını ve metni buradan güncellemesini sağlamalısınız. – pcarter

+0

farklı ne kadar java, realTime zamanlanmış Görev geliştirmek için tasarlanmamış, bu yüzden timeUnit biraz değişebilir ...... –

cevap

0

Bir Zamanlayıcıya ilettiğiniz gecikme, yalnızca olayın sıraya girmesinden önceki bir gecikme, olayın gerçekleşeceği tam bir zaman değil. Son aranan zamandan beri 10 msn geçtiğinden emin olabilirsiniz, SADECE 10 msn geçtiğinden emin olamazsınız.

Muhtemelen böyle bir şey istiyorum (mümkün olduğunca koduna az değişiklikle, bunun için kesinlikle farklı/daha optimum yolu vardır):

import javax.swing.Timer; 

Date dt = new Date(); 

timer = new Timer(10, new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     int min = 0, sec = 0, hundredSec = 0; 

     long millisec = (new Date()).getTime() - dt.getTime(); 
     hundredSec = (millisec/10) % 100; 
     sec = (millisec/1000) % 60; 
     min = (millisec/60000); 

     timerL.setText(String.format("%02d:%02d:%02d", min, sec, hundredSec)); 

    } 
}); 

burada bir kaç sorunları (timerL Orada eksik bildirimi ve setText çağrısında millisec referansını düzelttim, ancak yukarıda gördüğünüz gibi olduklarından, bir snippet yayınladığınızı sanıyorum.

1

Sorununuzun üçüncü satır koduyla ilgili olduğunu düşünüyorum. java API docs belirttiği gibi: "Gecikme parametresi, hem başlangıç ​​gecikmesini hem de olay ateşleme arasındaki gecikmeyi milisaniye olarak ayarlamak için kullanılır." Bu, her defasında 10 milisaniyelik bir gecikme olduğu ve gecikmenize neden olabileceği anlamına gelir. Eğer kod satırı değiştirebileceğini düzeltmek için:

timer = new Timer(0, new ActionListener()); 

yavaşça gerisinde aksine anında aday olacağını 10 0 değiştirerek. Zamanlayıcılar hakkında daha fazla bilgi edinmek için this article'u okumanızı tavsiye ederim.

+0

Ama eğer gecikme içinde 0 koyarsam, zamanlayıcı hızlı çalışmaya başlar. İlk Gecikme'yi ayarlıyorum ve gecikmeyi 4'e hızlı olarak ayarlarsam ve onu 5'e ayarlıyorumsa ne yapabilirim? – user5327287