For background, consider an implementation of StyleableProperty and CssMetaData as it is now.
public class MyButton extends Button {
public BooleanProperty fooProperty() {
return (BooleanProperty)foo;
}
private StyleableProperty<Boolean> foo =
new SimpleStyleableBooleanProperty(fooMetaData);
private static final CssMetaData<MyButton,Boolean> fooMetaData =
new CssMetaData<>("-my-foo", StyleConverter.getBooleanConverter()) {
@Override
public boolean isSettable(MyButton node) {
return !node.fooProperty().isBound();
}
@Override
public StyleableProperty<Boolean> getStyleableProperty(MyButton node) {
return node.foo;
}
};
static final List<CssMetaData<? extends Styleable, ?>> cssMetaData;
static {
List<CssMetaData<? extends Styleable, ?>> temp =
new ArrayList<>(Control.getClassCssMetaData());
temp.addAll(Arrays.asList(fooMetaData));
cssMetaData = Collections.unmodifiableList(temp);
}
@Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
return cssMetaData;
}
}
From the high-level view, there are two pieces here. First is the StyleableProperty which is used by CSS to set the calculated value of a style on a property. The second piece is the CssMetaData which is used by CSS to (primarily) discover what css properties to look up for a node (e.g., -fx-fill), and to get the StyleableProperty for setting the value (e.g., get the StyleableProperty that corresponds to -fx-fill).
With StyleablePropertyFactory, the same can be accomplished in fewer lines of code.
public class MyButton extends Button {
private static final StyleablePropertyFactory<MyButton> FACTORY =
new StyleablePropertyFactory<>(Button.getClassCssMetaData());
public BooleanProperty fooProperty() {
return (BooleanProperty)foo;
}
private StyleableProperty<Boolean> foo =
new Factory.createStyleableBooleanProperty(this, "foo", "-my-foo");
@Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
return cssMetaData;
}
}