import java.util.Calendar;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import com.junlts.util.SwingUtil;
public class Clock extends javax.swing.JFrame {
private int hour;
private boolean isAlarmOn;
private ImageIcon clockImageOn, clockImageOff;
private JLabel clockLabel;
private boolean isAlarm;
public Clock() {
hour = 0;
isAlarmOn = false;
isAlarm = false;
clockImageOn = new ImageIcon("images/clock_on.png");
clockImageOff = new ImageIcon("images/clock_off.png");
clockLabel = new JLabel("00:00");
setupUI();
}
private void setupUI() {
this.setIconImage(ClassLoader.getSystemResourceAsStream("images/icon.png"));
this.setTitle("Java Clock");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
clockLabel.setFont(new java.awt.Font("Segoe UI", 1, 60));
clockLabel.setBounds(50, 50, 350, 150);
this.add(clockLabel);
JButton clockButton = new JButton("Start");
clockButton.addActionListener(e -> {
if (clockButton.getText().equals("Start")) {
clockButton.setText("Stop");
clockButton.repaint();
new Timer(1000, (EventObject e1) -> {
updateClock();
}).start();
} else {
clockButton.setText("Start");
clockButton.repaint();
Timer timer = (Timer) e1;
timer.stop();
}
});
clockButton.setBounds(75, 250, 150, 50);
this.add(clockButton);
JButton alarmButton = new JButton("Set Alarm");
alarmButton.addActionListener(e -> {
int hour = JOptionPane.showConfirmDialog(this, "Enter hour (0-23):", "Set Alarm", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (hour == JOptionPane.OK_OPTION) {
this(hour);
isAlarmOn = true;
alarmButton.setText("Alarm is set");
alarmButton.repaint();
} else {
alarmButton.setText("Set Alarm");
alarmButton.repaint();
}
});
alarmButton.setBounds(250, 250, 150, 50);
this.add(alarmButton);
JButton playButton = new JButton("Play Sound");
playButton.addActionListener(e -> {
if (isAlarm) {
javax.sound.sampled.Clip clip = AudioPlayer.playSound("sounds/alarm.wav");
clip.start();
}
});
playButton.setBounds(75, 320, 150, 50);
this.add(playButton);
SwingUtil.centerWindowOnScreen(this);
this.setVisible(true);
}
private void updateClock() {
Calendar calendar = Calendar.getInstance();
hour = calendar.get(Calendar.HOUR);
if (isAlarm && hour == 6) {
isAlarm = false;
}
clockLabel.setText(String.format("%02d:%02d", hour % 12, hour / 12));
clockLabel.repaint();
}
private void setHour(int hour) {
this.hour = hour;
repaint();
}
private boolean isAlarmOn() {
return isAlarmOn;
}
private boolean isAlarm() {
return isAlarm;
}
public static void main(String[] args) {
SwingUtil.invokeLater(Clock::new);
}
}
上述代码是一个Java小闹钟程序。程序的主要逻辑如下:
Clock
的类,该类继承自javax.swing.JFrame
,表示一个窗口。Clock
类中定义了以下几个成员变量:
hour
:表示当前时间的小时数。isAlarmOn
:表示是否打开了闹钟。clockImageOn
和clockImageOff
:表示开启和关闭状态的时钟图片。clockLabel
:表示显示时间的标签。isAlarm
:表示是否到了设定的闹钟时间。Clock
类的构造方法中,初始化了上述成员变量,并调用setupUI()
方法来设置界面。setupUI()
方法主要做了以下事情:
EXIT_ON_CLOSE
。JLabel
实例,并设置显示文本为"00:00",并将其添加到窗口中。JButton
实例clockButton
,用于启动或停止定时器,设置点击事件的处理方法为clockButtonActionListener
,并将其添加到窗口中。JButton
实例alarmButton
,用于设置闹钟,设置点击事件的处理方法为alarmButtonActionListener
,并将其添加到窗口中。JButton
实例playButton
,用于播放闹钟声音,设置点击事件的处理方法为playButtonActionListener
,并将其添加到窗口中。SwingUtil.invokeLater()
方法来确保界面的显示是线程安全的,并将Clock
类的构造方法作为参数传入,以便在事件线程中创建Clock
对象。updateClock()
方法用于更新时间显示,方法内部逻辑如下:
isAlarm
设为false,表示闹钟已响。clockLabel
的显示文本。clockLabel
组件,使其显示更新后的内容。setHour(int hour)
方法用于设置时间,方法接受一个表示小时数的参数,并将其赋值给成员变量hour
。然后调用repaint()
方法刷新组件。isAlarmOn()
方法用于判断闹钟是否打开,方法返回成员变量isAlarmOn
的值。isAlarm()
方法用于判断是否到了闹钟时间,方法返回成员变量isAlarm
的值。main()
方法中,通过调用SwingUtil.invokeLater()
方法来创建Clock
对象,实现线程安全的界面显示。