为什么我的 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 变热之外,它通常没有其他好处。更好的方法是使用事件驱动的方法,但这超出了这个答案的范围。