public Lcd() {
        getStyleClass().add("lcd");        
        value                     = new DoublePropertyBase(0) {
            @Override protected void invalidated() {
                set(clamp(getMinValue(), getMaxValue(), get()));
            }
            @Override public Object getBean() { return this; }
            @Override public String getName() { return "value"; }
        };
        currentValue              = new SimpleDoubleProperty(0);
        formerValue               = new SimpleDoubleProperty(0);
        initialized               = false;
        firstTime                 = true;
        keepAspect                = true;
        toggleValue               = false;
        toggleThreshold           = false;
        interval                  = 500_000_000l;
        lastBlinkTimerCall        = System.nanoTime();
        lastThresholdTimerCall    = System.nanoTime();
        timer                     = new AnimationTimer() {
            @Override public void handle(final long NOW) {
                if (isBlinking() && NOW > lastBlinkTimerCall + interval) {
                    toggleValue ^= true;
                    setValueVisible(toggleValue);
                    lastBlinkTimerCall = NOW;
                }
                if (thresholdExceeded && NOW > lastThresholdTimerCall + interval) {
                    toggleThreshold ^= true;
                    thresholdVisible.set(toggleThreshold);
                    lastThresholdTimerCall = NOW;
                }
            }
        };
        toValueAnimation = new Transition() {
            {
                setCycleDuration(Duration.millis(getAnimationDuration()));
            }
            protected void interpolate(double frac) {
                currentValue.set(getFormerValue() + (getValue() - getFormerValue()) * frac);
            }
        };
        init();
        initialized = true;
    }