2017-07-27 5 views
0

Ich möchte eine digitale Uhr in Java, die Zeit und Datum anzeigt, und die Doppelpunkte sollten blinken. Allerdings kann ich die Doppelpunkte nicht blinken lassen. Hier ist mein Code:Aktualisieren einer Uhr mit 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)); 
    } 
} 

Wie Sie sehen können, habe ich die folgenden Zeilen:

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

diese Weise die Doppelpunkte sind sichtbar, wenn die Sekunden ungerade sind, da sonst die Doppelpunkte sind nicht sichtbar.

Das Problem ist, dass, wenn ich das Programm starte und das zweite ist ungerade zu diesem Zeitpunkt, dann sind die Doppelpunkte immer sichtbar. Ich verstehe nicht warum, seit der zweiten Änderungen (Zeitaktualisierungen), aber die Doppelpunkte nicht.

+1

Sie setzen das SimpleDateFormat nur einmal beim Start im Konstruktor von ClockLabel. Sie sollten die Formate in actionPerformed() umschalten. – Johan

+0

Übrigens sind diese Datum/Uhrzeit-Klassen jetzt veraltet. Überprüfen Sie die java.time-Klassen, das ThreeTen-Backport-Projekt und das ThreeTenABP-Projekt. –

Antwort

2

Ich glaube, Sie müssen dieses Kontroll

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

innerhalb des actionPerformed Methode setzen. das ist die Art und Weise, wie Sie die: auf jede Sekunde wechseln können.

0

Wenn Sie Ihr Projekt im Debug-Modus ausführen, werden Sie verstehen, dass die switch-case-Anweisung nur einmal (beim Start) ausgeführt wird. Dies ist gemäß der obigen Implementierung normal, da die Logik innerhalb des Konstruktors angeordnet ist, der nur Baumzeiten genannt wird.

Kurz gesagt, Sie müssen diese Implementierung radikal ändern.

Verwandte Themen