我希望代码能够触发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();
这是我编写的用于触发警报的代码,但是还没有编写“播放声音”,因为我甚至无法显示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();
}
});
答案 0 :(得分:1)
在您的检查循环中,您需要在每次传递时重新获取Calendar
,否则,您最终会反复重新检查相同的时间值。移动线
GregorianCalendar g = new GregorianCalendar();
在循环中。
注意:这不是解决此问题的特别好方法。你正在做的事情被称为“忙碌的等待”,除了让CPU变热之外,它通常不会有什么好处。更好的方法是使用事件驱动的方法,但这超出了这个答案的范围。
答案 1 :(得分:-1)
在AMorPM = 1之后,我注意到一个主要问题是缺失};使AM无法工作。