2017-07-27 4 views
0

Je veux une horloge numérique en Java affichant l'heure et la date, et les deux points devraient clignoter. Cependant, je ne peux pas faire clignoter les deux points. Voici mon code:Mettre à jour une horloge en utilisant ActionListener - Java

import java.awt.Font; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 
import javax.swing.SwingConstants; 
import java.util.*; 
import java.text.*; 

public class DigitalClock { 

    public static void main(String[] arguments) { 

    ClockLabel dateLable = new ClockLabel("date"); 
    ClockLabel timeLable = new ClockLabel("time"); 
    ClockLabel dayLable = new ClockLabel("day"); 

    JFrame.setDefaultLookAndFeelDecorated(true); 
    JFrame f = new JFrame("Digital Clock"); 
    f.setSize(300,150); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setLayout(new GridLayout(3, 1)); 

    f.add(dateLable); 
    f.add(timeLable); 
    f.add(dayLable); 

    f.getContentPane().setBackground(Color.black); 

    f.setVisible(true); 
    } 
} 

class ClockLabel extends JLabel implements ActionListener { 
    String type; 
    SimpleDateFormat sdf; 
    public ClockLabel(String type) { 
    this.type = type; 
    setForeground(Color.green); 
    Calendar calendar = Calendar.getInstance(); 
    int seconds = calendar.get(Calendar.SECOND); 
    switch (type) { 
     case "date" : sdf = new SimpleDateFormat(" MMMM dd yyyy"); 
        setFont(new Font("sans-serif", Font.PLAIN, 12)); 
        setHorizontalAlignment(SwingConstants.LEFT); 
        break; 
     case "time" : if(seconds % 2 != 0) sdf = new SimpleDateFormat("hh:mm:ss a"); 
        else sdf = new SimpleDateFormat("hh mm ss a"); 
        setFont(new Font("sans-serif", Font.PLAIN, 40)); 
        setHorizontalAlignment(SwingConstants.CENTER); 
        break; 
     case "day" : sdf = new SimpleDateFormat("EEEE "); 
        setFont(new Font("sans-serif", Font.PLAIN, 16)); 
        setHorizontalAlignment(SwingConstants.RIGHT); 
        break; 
     default  : sdf = new SimpleDateFormat(); 
        break; 
    } 
    Timer t = new Timer(1000, this); 
    t.start(); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     Date d = new Date(); 
    setText(sdf.format(d)); 
    } 
} 

Comme vous pouvez le voir, je les lignes suivantes:

case "time" : if(seconds % 2 != 0) sdf = new SimpleDateFormat("hh:mm:ss a"); 
       else sdf = new SimpleDateFormat("hh mm ss a"); 

De cette façon, les deux points sont visibles lorsque les secondes sont impairs, sinon les deux points ne sont pas visibles.

Le problème est que si je lance le programme et que le second est impair à ce moment-là, alors les deux-points sont toujours visibles. Je ne comprends pas pourquoi, puisque le second change (mise à jour du temps), mais pas les deux-points.

+1

Vous ne définissez le SimpleDateFormat qu'une seule fois au démarrage dans le constructeur de ClockLabel. Vous devriez changer les formats dans actionPerformed() – Johan

+0

En passant, ces classes date-heure sont maintenant héritées. Vérifiez les classes java.time, le projet ThreeTen-Backport et le projet ThreeTenABP. –

Répondre

2

je pense que vous avez besoin de mettre cette vérification

if(seconds % 2 != 0) 
    sdf = new SimpleDateFormat("hh:mm:ss a"); 
else 
    sdf = new SimpleDateFormat("hh mm ss a"); 

dans la méthode actionPerformed. C'est la façon dont vous pouvez changer le: sur chaque sec.

0

Si vous exécutez votre projet en mode débogage, vous comprendrez que l'instruction de casse ne s'exécute qu'une seule fois (au démarrage). Ceci est normal selon l'implémentation ci-dessus car la logique est placée à l'intérieur du constructeur qui est appelé seulement les heures de l'arbre.

En bref, vous devez modifier radicalement cette implémentation.