How to trigger property invalidation?
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