How to trigger property invalidation? (original) (raw)

Richard Bair richard.bair at oracle.com
Fri Nov 2 09:30:49 PDT 2012


In Region we have a custom property that we can use to force invalidation. Is this sort of what you're looking for?

private InsetsProperty insets = new InsetsProperty();
public final Insets getInsets() { return insets.get(); }
public final ReadOnlyObjectProperty<Insets> insetsProperty() { return insets; }
private final class InsetsProperty extends ReadOnlyObjectProperty<Insets> {
    private Insets cache = null;
    private ExpressionHelper<Insets> helper = null;

    @Override public Object getBean() { return Region.this; }
    @Override public String getName() { return "insets"; }

    @Override public void addListener(InvalidationListener listener) {
        helper = ExpressionHelper.addListener(helper, this, listener);
    }

    @Override public void removeListener(InvalidationListener listener) {
        helper = ExpressionHelper.removeListener(helper, listener);
    }

    @Override public void addListener(ChangeListener<? super Insets> listener) {
        helper = ExpressionHelper.addListener(helper, this, listener);
    }

    @Override public void removeListener(ChangeListener<? super Insets> listener) {
        helper = ExpressionHelper.removeListener(helper, listener);
    }

    void fireValueChanged() {
        cache = null;
        requestLayout();
        ExpressionHelper.fireValueChangedEvent(helper);
    }

    @Override public Insets get() {
        // If a shape is specified, then we don't really care whether there are any borders
        // specified, since borders of shapes do not contribute to the insets.
        if (_shape != null) return getPadding();

        // If there is no border or the border has no insets itself, then the only thing
        // affecting the insets is the padding, so we can just return it directly.
        final Border b = getBorder();
        if (b == null || Insets.EMPTY.equals(b.getInsets())) {
            return getPadding();
        }

        // There is a border with some non-zero insets and we do not have a _shape, so we need
        // to take the border's insets into account
        if (cache == null) {
            // Combine the padding and the border insets.
            // TODO note that negative border insets were being ignored, but
            // I'm not sure that that made sense or was reasonable, so I have
            // changed it so that we just do simple math.
            // TODO Stroke borders should NOT contribute to the insets. Ensure via tests.
            final Insets borderInsets = b.getInsets();
            final Insets paddingInsets = getPadding();
            cache = new Insets(
                    borderInsets.getTop() + paddingInsets.getTop(),
                    borderInsets.getRight() + paddingInsets.getRight(),
                    borderInsets.getBottom() + paddingInsets.getBottom(),
                    borderInsets.getLeft() + paddingInsets.getLeft()
            );
        }
        return cache;
    }
};


More information about the openjfx-dev mailing list