I have attached some java files to RT-36510 that are aimed at reducing the amount of boiler-plate code needed to implement StyleableProperty and CssMetaData. The code is not complete - it can only create a StyleableProperty<Boolean> right now - but it is sufficiently far along to warrant a review.

Please see https://javafx-jira.kenai.com/browse/RT-36510#comment-414209 for more information.

Example with the RT-36510 code:

public class MyButton extends Button implements StyleableSupplier<MyButton> {

    public MyButton(String text) {
        super();
        getStyleClass().add("foo");
    }

    public MyButton get() { return this; }

public ObservableValue<Boolean> selectedProperty() { return (ObservableValue<Boolean>)selected; }
    public boolean isSelected() { return selected.getValue(); }
public void setSelected(boolean isSelected) { selected.setValue(isSelected); } private final StyleableProperty<Boolean> selected = StyleablePropertyFactory.createStyleableBooleanProperty(this, "-my-selected", s -> ((MyButton) s).selected);

    @Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
        return StyleablePropertyFactory.getCssMetaData(this);
    }

}

The same example without the RT-36510 code:

public class MyButton extends Button {

    public MyButton(String text) {
        super();
        getStyleClass().add("foo");
    }

public ObservableValue<Boolean> selectedProperty() { return (ObservableValue<Boolean>)selected; }
    public boolean isSelected() { return selected.getValue(); }
public void setSelected(boolean isSelected) { selected.setValue(isSelected); } private final StyleableProperty<Boolean> selected = new SimpleStyleableBooleanProperty(SELECTED);

private static CssMetaData<MyButton, Boolean> SELECTED = new CssMetaData<MyButton, Boolean>("-my-selected", StyleConverter.getBooleanConverter(), Boolean.FALSE) {
        @Override
        public boolean isSettable(MyButton styleable) {
return !((Property<Boolean>)styleable.selectedProperty()).isBound();
        }

        @Override
public StyleableProperty<Boolean> getStyleableProperty(MyButton styleable) {
            return styleable.selected;
        }
    };

private final static List<CssMetaData<? extends Styleable, ?>> CSS_META_DATA;
    static {
List<CssMetaData<? extends Styleable, ?>> list = new ArrayList<>(Button.getClassCssMetaData());
        list.add(SELECTED);
        CSS_META_DATA = Collections.unmodifiableList(list);
    }

    @Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
        return CSS_META_DATA;
    }

}


Reply via email to