简体   繁体   中英

Why my Java alarm clock code doesn't work properly?

I want the code to trigger the JOptionPane.

Here is the code for the working clock:

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();

Here is code I wrote to trigger alarm, but no 'play sound' is coded yet, because I can't even get the JOptionPane to appear. Why? I want to get the values from spinners, than compare to real time until they meet and than trigger alarm and exit thread. How to fix it?

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();
    }
});

In your checking loop, you need to reacquire the Calendar on every pass, otherwise, you'll just end up re-checking the same time value over and over. Move the line

GregorianCalendar g = new GregorianCalendar();

inside the loop.

Note: This is not a particularly good approach to this problem. What you're doing is called "busy waiting" and it's generally not good for much other than making the CPU get hot. A better approach would be to use an event-driven approach, but that's beyond the scope of this answer.

One major problem I notice is missing } after AMorPM = 1; making it impossible to work for AM.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM