使用ActionListener更新时钟 - Java

时间:2017-07-27 09:32:24

标签: java timer jframe 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));
  }
}

如您所见,我有以下几行:

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

这样,当秒为奇数时,冒号可见,否则冒号不可见。

问题在于,如果我启动程序并且当时第二个是奇数,那么冒号总是可见的。我不明白为什么,因为第二次更改(时间更新),但冒号不会。

2 个答案:

答案 0 :(得分:2)

我认为您需要进行此项检查

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

actionPerformed方法中。这就是你每次都能切换的方式。

答案 1 :(得分:0)

如果在调试模式下运行项目,您将理解switch-case语句只运行一次(在启动时)。根据上面的实现,这是正常的,因为逻辑被放置在仅被称为树时间的构造函数内。

简而言之,您需要彻底改变此实现。