Java 时钟上的闹钟
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15959285/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Alarm on Java Clock
提问by Ashley Price
This is a homework assignment.
这是家庭作业。
I am trying to create a java 12 hour clock with an alarm. After a week of constant work I finally have it running, however, when I set the alarm, it goes off 2-3 minutes before the set time. Also, when I hit snooze (which is supposed to snooze for 2 minutes) it immediately goes off the next minute. I have 10 classes total, but I am adding the ones that should be relevant Time
and TimeManager
. I am just beginning Java, and I am having a hard time with it, so sorry if this is a dumb question.
我正在尝试创建一个带有闹钟的 java 12 小时时钟。经过一周的持续工作,我终于让它运行了,但是,当我设置闹钟时,它在设置时间前 2-3 分钟响起。此外,当我按下小睡(应该小睡 2 分钟)时,它会在下一分钟立即关闭。我总共有 10 个课程,但我正在添加应该相关的课程Time
和TimeManager
. 我刚刚开始使用 Java,我很难用它,如果这是一个愚蠢的问题,很抱歉。
Time
:
Time
:
public class Time {
private int hour;
private int minute;
public Time(int initHour, int initMinute) {
if (1 <= hour && hour <= 12) {
hour = initHour;
}
else if (hour == 0) {
hour = 12;
}
if (0 <= minute && minute <= 59 ) {
minute = initMinute;
}
}
public void addOneMinute() {
minute++;
if (minute == 59) {
incrementHour();
minute = 0;
}
}
public void incrementHour() {
hour++;
if (hour > 12) {
hour = 1;
}
}
public void incrementMinute() {
minute++;
if (minute == 59) {
minute = 0;
}
}
public int getHour() {
if (hour >= 1 && hour <= 12) {
}
return hour;
}
public int getMinute() {
if (minute >=0 && minute <= 59) {
}
return minute;
}
public boolean equals(Time time) {
if (hour == hour && minute == minute) {
return true;
}
else {
return false;
}
}
}
TimeManager
:
TimeManager
:
public class TimeManager {
private static final int SNOOZE_DURATION_IN_MINUTES = 2;
private Time currentTime;
private Time alarmTime;
private Time snoozeTime;
private Display display;
private ModeManager modeMgr;
private Alarm alarm;
public TimeManager() {
currentTime = new Time(12,0);
alarmTime = new Time(12,0);
snoozeTime = new Time(12,0);
}
public void setDisplay(Display newDisplay) {
display = newDisplay;
showCurrentTime();
}
public void setModeManager(ModeManager newModeMgr) {
modeMgr = newModeMgr;
}
public void setAlarm(Alarm newAlarm) {
alarm = newAlarm;
}
public void incrementCurrentMinute() {
currentTime.addOneMinute();
Mode mode = modeMgr.getMode();
if (mode == mode.ALARM_ON || mode == mode.ALARM_OFF || mode == mode.SET_TIME) {
updateDisplay();
}
if (mode == mode.ALARM_ON) {
if (currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
soundAlarmIfNecessary();
}
}
}
public void incrementCurrentHour() {
currentTime.incrementHour();
Mode mode = modeMgr.getMode();
if (mode == mode.ALARM_ON || mode == mode.ALARM_OFF || mode == mode.SET_TIME) {
updateDisplay();
}
if (mode == mode.ALARM_ON) {
if (currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
soundAlarmIfNecessary();
}
}
}
public void incrementAlarmMinute() {
alarmTime.incrementMinute();
Mode mode = modeMgr.getMode();
if (mode == mode.SET_ALARM) {
updateDisplay();
}
if (mode == mode.ALARM_ON) {
if (currentTime.equals(alarmTime)) {
soundAlarmIfNecessary();
}
}
}
public void incrementAlarmHour() {
alarmTime.incrementHour();
Mode mode = modeMgr.getMode();
if (mode == mode.SET_ALARM) {
updateDisplay();
}
if (mode == mode.ALARM_ON) {
if (currentTime.equals(alarmTime)) {
soundAlarmIfNecessary();
}
}
}
public void snooze() {
while (alarm.isOn()) {
alarm.off();
int hour = currentTime.getHour();
int minute = currentTime.getMinute();
minute += SNOOZE_DURATION_IN_MINUTES;
if (minute > 59) {
minute -= 60;
++hour;
}
snoozeTime = new Time(hour, minute);
}
}
public void showCurrentTime() {
display.showHour(currentTime.getHour());
display.showMinute(currentTime.getMinute());
}
public void showAlarmTime() {
display.showHour(alarmTime.getHour());
display.showMinute(alarmTime.getMinute());
}
private void updateDisplay() {
Mode mode = modeMgr.getMode();
if (mode == mode.SET_TIME || mode == mode.ALARM_ON || mode == mode.ALARM_OFF) {
showCurrentTime();
}
else {
showAlarmTime();
}
}
private void soundAlarmIfNecessary() {
Mode mode = modeMgr.getMode();
if (mode == mode.ALARM_ON && currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
alarm.on();
}
}
}
回答by devrobf
Amoungst other things, you have quite a significant bug in the Time.equals()
method:
在其他事情中,您在该Time.equals()
方法中有一个相当大的错误:
public boolean equals(Time time) {
if (hour == hour && minute == minute) {
return true;
}
else {
return false;
}
}
}
The expression hour == hour
is comparing the hour
instance variable with itself, which will always be true
. This is clearly not what you want, instead you want to compare it with the hour
field of the given time
argument, like this:
表达式hour == hour
将hour
实例变量与其自身进行比较,它总是true
. 这显然不是您想要的,而是您想将其与hour
给定time
参数的字段进行比较,如下所示:
if (hour == time.getHour() && minute == time.getMinute() ) {