为什么我的Java闹钟代码无法正常工作?

时间:2016-06-03 19:03:16

标签: java swing clock alarm

我希望代码能够触发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();
    }
});

2 个答案:

答案 0 :(得分:1)

在您的检查循环中,您需要在每次传递时重新获取Calendar,否则,您最终会反复重新检查相同的时间值。移动线

GregorianCalendar g = new GregorianCalendar();

在循环中。

注意:这不是解决此问题的特别好方法。你正在做的事情被称为“忙碌的等待”,除了让CPU变热之外,它通常不会有什么好处。更好的方法是使用事件驱动的方法,但这超出了这个答案的范围。

答案 1 :(得分:-1)

在AMorPM = 1之后,我注意到一个主要问题是缺失};使AM无法工作。