2010-11-30 7 views
0

J'ai millisecondes et je le convertir hh: mm: ss Maintenant, je veux faire pour réduire automatiquement les heures supplémentaires de valeur .. quelque chose comme compte à reboursJAVA prendre le temps de réduire à zéro par minuterie swing

par exemple, lorsque l'utilisateur voit, 02:11 0 -> 02:10 59 -> 02h10 58 ...

Voici mon code ..

 Timer t = new Timer(1000, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       int s = ((TIMER/1000) % 60); 
       int m = (((TIMER/1000)/60) % 60); 
       int h = ((((TIMER/1000)/60) /60) % 60); 

       timing.setText(hour + " hours, " + min + " minutes" + sec + " seconds"); 
       timing.repaint(); 
} 
} 
t.start(); 

est-il possible?

Répondre

1
final Timer t = new Timer(1000, new ActionListener() { 
    private long time = 10 * 1000; //10 seconds, for example 

    public void actionPerformed(ActionEvent e) { 
     if (time >= 0) { 
      long s = ((time/1000) % 60); 
      long m = (((time/1000)/60) % 60); 
      long h = ((((time/1000)/60)/60) % 60); 
      timing.setText(h + " hours, " + m + " minutes " + s + " seconds"); 
      time -= 1000; 
     } 
    } 
}); 
t.start(); 
0

La valeur TIMER n'est jamais décrémentée par l'événement de temporisation. Par conséquent, la même heure sera toujours affichée toutes les 1000 millisecondes. Editer: En supposant que "timing" est un composant Swing, l'appel à repeindre ne devrait pas être nécessaire.

+0

comment puis-je le faire? Je suis nouveau à Java – SOer

+0

En supposant que TIMER est un type numérique, TIMER - = 1000; devrait le faire. http://download.oracle.com/javase/tutorial/java/nutsandbolts/op1.html Voici d'autres références sur les différents minuteurs de Java: http://java.sun.com/products/jfc/tsc/articles/timer/et http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html – Tansir1

0

Une option plus sûre consiste à prendre l'heure réelle. La raison en est que votre application peut s'arrêter pour des pewriods de temps. esp si votre machine est occupée. Cela signifie qu'un compte à rebours peut ne pas être appelé aussi souvent que prévu. Si vous utilisez System.currentTimeMillis(), le temps sera toujours correct, quoi qu'il arrive.

1

Comme Peter l'a mentionné dans sa réponse, vous ne devriez pas relayer sur la réduction d'un nombre, car il n'y a pas de garanties que actionPerformed est invoquée droit dans chaque seconde. Le ci-dessous est un exemple de travail, qui arrête la minuterie sur la finition (détaillée et par conséquent code):

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Test extends JFrame { 
    private JTextField text; 
    private Timer timer; 
    private JButton start; 

    public Test() { 
    super("Countdown timer"); 
    text = new JTextField("2", 8); 
    start = new JButton("Start"); 
    start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent click) { 
     final long current = System.currentTimeMillis(); 
     try { 
      final long limit = Integer.parseInt(text.getText().trim())* 1000; // X seconds 
      timer = new Timer(1000, new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       long time = System.currentTimeMillis(); 
       long passed = time - current; 
       long remaining = limit - passed; 
       if(remaining <= 0) { 
       text.setText("2"); 
       timer.stop(); 
       } else { 
       long seconds = remaining/1000; 
       long minutes = seconds/60; 
       long hours = minutes/60; 
       text.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds%60)); 
       } 
      } 
      }); 
      timer.start(); 
     } catch(NumberFormatException nfe) { 
      // debug/report here 
      nfe.printStackTrace(); 
     } 
     }}); 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
    panel.add(text); 
    panel.add(new JLabel(" seconds")); 
    panel.add(start); 
    add(panel); 
    } 

    public static void main(String [] args) throws Exception { 
    Test frame = new Test(); 
    frame.setDefaultCloseOperation(Test.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 
+0

merci pour votre réponse détaillée. – SOer