为什么我的 Java 闹钟代码不能正常工作?
Why my Java alarm clock code doesn't work properly?
我想要代码触发 JOptionPane。
这里是工作时钟的代码:
new Thread() {
public void run() {
while (true) {
GregorianCalendar cal = new GregorianCalendar();
int hour = cal.get(GregorianCalendar.HOUR);
int min = cal.get(GregorianCalendar.MINUTE);
int sec = cal.get(GregorianCalendar.SECOND);
int AM_PM = cal.get(GregorianCalendar.AM_PM);
String day_night;
if (AM_PM == 1) {
day_night = "PM";
} else {
day_night = "AM";
}
String time = hour + ":" + min + ":" + sec + " " + day_night;
lblClock.setText(time);
}
}
}.start();
这是我编写的用于触发警报的代码,但尚未编码 'play sound',因为我什至无法让 JOptionPane 出现。为什么?我想从微调器中获取值,而不是与实时比较直到它们相遇,然后触发警报和退出线程。如何解决?
btnAlarm.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
new Thread() {
public void run() {
txtAlarmSet.setVisible(true);
boolean flag = false;
GregorianCalendar g = new GregorianCalendar();
int hour = Integer.parseInt(spinnerHour.getModel().getValue().toString());
int minute = Integer.parseInt(spinnerMinute.getModel().getValue().toString());
int second = Integer.parseInt(spinnerSecond.getModel().getValue().toString());
int AMorPM;
if (rdbtnAm.isSelected()) {
AMorPM = 0;
} else
AMorPM = 1;
while (flag == false) {
int realHour = g.get(GregorianCalendar.HOUR);
int realMinute = g.get(GregorianCalendar.MINUTE);
int realSecond = g.get(GregorianCalendar.SECOND);
int realAM_PM = g.get(GregorianCalendar.AM_PM);
if (hour == realHour && minute == realMinute && second == realSecond
&& AMorPM == realAM_PM) {
JOptionPane.showMessageDialog(null, "WORKS!"); // <- this doesn't appear!
flag = true;
}
}
txtAlarmSet.setVisible(false);
}
}.start();
}
});
我注意到的一个主要问题是在 AMorPM = 1 之后缺少 };无法为 AM 工作。
在您的检查循环中,您需要在每次通过时重新获取 Calendar
,否则,您最终只会一遍又一遍地重新检查相同的时间值。移动行
GregorianCalendar g = new GregorianCalendar();
循环内部。
注意:这不是解决此问题的特别好的方法。您正在做的事情叫做 "busy waiting",除了使 CPU 变热之外,它通常没有其他好处。更好的方法是使用事件驱动的方法,但这超出了这个答案的范围。
我想要代码触发 JOptionPane。
这里是工作时钟的代码:
new Thread() {
public void run() {
while (true) {
GregorianCalendar cal = new GregorianCalendar();
int hour = cal.get(GregorianCalendar.HOUR);
int min = cal.get(GregorianCalendar.MINUTE);
int sec = cal.get(GregorianCalendar.SECOND);
int AM_PM = cal.get(GregorianCalendar.AM_PM);
String day_night;
if (AM_PM == 1) {
day_night = "PM";
} else {
day_night = "AM";
}
String time = hour + ":" + min + ":" + sec + " " + day_night;
lblClock.setText(time);
}
}
}.start();
这是我编写的用于触发警报的代码,但尚未编码 'play sound',因为我什至无法让 JOptionPane 出现。为什么?我想从微调器中获取值,而不是与实时比较直到它们相遇,然后触发警报和退出线程。如何解决?
btnAlarm.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
new Thread() {
public void run() {
txtAlarmSet.setVisible(true);
boolean flag = false;
GregorianCalendar g = new GregorianCalendar();
int hour = Integer.parseInt(spinnerHour.getModel().getValue().toString());
int minute = Integer.parseInt(spinnerMinute.getModel().getValue().toString());
int second = Integer.parseInt(spinnerSecond.getModel().getValue().toString());
int AMorPM;
if (rdbtnAm.isSelected()) {
AMorPM = 0;
} else
AMorPM = 1;
while (flag == false) {
int realHour = g.get(GregorianCalendar.HOUR);
int realMinute = g.get(GregorianCalendar.MINUTE);
int realSecond = g.get(GregorianCalendar.SECOND);
int realAM_PM = g.get(GregorianCalendar.AM_PM);
if (hour == realHour && minute == realMinute && second == realSecond
&& AMorPM == realAM_PM) {
JOptionPane.showMessageDialog(null, "WORKS!"); // <- this doesn't appear!
flag = true;
}
}
txtAlarmSet.setVisible(false);
}
}.start();
}
});
我注意到的一个主要问题是在 AMorPM = 1 之后缺少 };无法为 AM 工作。
在您的检查循环中,您需要在每次通过时重新获取 Calendar
,否则,您最终只会一遍又一遍地重新检查相同的时间值。移动行
GregorianCalendar g = new GregorianCalendar();
循环内部。
注意:这不是解决此问题的特别好的方法。您正在做的事情叫做 "busy waiting",除了使 CPU 变热之外,它通常没有其他好处。更好的方法是使用事件驱动的方法,但这超出了这个答案的范围。