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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 21:26:59  来源:igfitidea点击:

Alarm on Java Clock

javaalarm

提问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 个课程,但我正在添加应该相关的课程TimeTimeManager. 我刚刚开始使用 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 == hourhour实例变量与其自身进行比较,它总是true. 这显然不是您想要的,而是您想将其与hour给定time参数的字段进行比较,如下所示:

    if (hour == time.getHour() && minute == time.getMinute() ) {