public RoundLcdClock() {
        hColor        = new SimpleObjectProperty<>(this, "hourColor", Color.BLACK);
        mColor        = new SimpleObjectProperty<>(this, "minuteColor", Color.rgb(0, 0, 0, 0.5));
        m5Color       = new SimpleObjectProperty<>(this, "5MinuteColor", Color.BLACK);
        sColor        = new SimpleObjectProperty<>(this, "secondColor", Color.BLACK);
        timeColor     = new SimpleObjectProperty<>(this, "timeColor", Color.BLACK);
        dateColor     = new SimpleObjectProperty<>(this, "dateColor", Color.BLACK);
        alarmOn       = new SimpleBooleanProperty(this, "alarmOn", false);
        alarm         = new SimpleObjectProperty<>(LocalTime.now().minusMinutes(1));
        dateVisible   = new SimpleBooleanProperty(this, "dateVisible", false);
        alarmVisible  = new SimpleBooleanProperty(this, "alarmVisible", false);
        time          = new StringBuilder();
        lastTimerCall = System.nanoTime();
        timer = new AnimationTimer() {
            @Override public void handle(long now) {
                if (now > lastTimerCall + 100_000_000l) {
                    time.setLength(0);
                    pm    = LocalTime.now().get(ChronoField.AMPM_OF_DAY) == 1;
                    hours = LocalTime.now().getHour();
                    String hourString = Integer.toString(hours);
                    if (hours < 10) {
                        time.append("0");
                        time.append(hourString.substring(0, 1));
                    } else {
                        time.append(hourString.substring(0, 1));
                        time.append(hourString.substring(1));
                    }

                    time.append(":");

                    minutes = LocalTime.now().getMinute();
                    String minutesString = Integer.toString(minutes);
                    if (minutes < 10) {
                        time.append("0");
                        time.append(minutesString.substring(0, 1));
                    } else {
                        time.append(minutesString.substring(0, 1));
                        time.append(minutesString.substring(1));
                    }

                    seconds = LocalTime.now().getSecond();

                    if (isAlarmOn() && LocalTime.now().isAfter(getAlarm()) && LocalTime.now().isBefore(getAlarm().plusNanos(105_000_000))) {
                        fireAlarmEvent();
                    }

                    drawForeground();
                    lastTimerCall = now;
                }
            }
        };

        init();
        initGraphics();
        registerListeners();
        timer.start();
    }