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 Timeand 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 == houris comparing the hourinstance variable with itself, which will always be true. This is clearly not what you want, instead you want to compare it with the hourfield of the given timeargument, like this:
表达式hour == hour将hour实例变量与其自身进行比较,它总是true. 这显然不是您想要的,而是您想将其与hour给定time参数的字段进行比较,如下所示:
if (hour == time.getHour() && minute == time.getMinute() ) {

