CSS metadata boilerplate
Tomas Mikula
tomas.mikula at gmail.com
Wed Jan 8 04:11:27 PST 2014
+1. I ended up creating such property subclasses myself, too. And I don't
provide the static getClassCssMetaData() either.
Tomas
On Wed, Jan 8, 2014 at 7:05 AM, Tom Eugelink <tbee at tbee.org> wrote:
>
> Yes, I had similar considerations. I was thinking about providing exactly
> such extended Property classes in JFXtras to remove as much of the
> boilerplate.
>
> Tom
>
>
>
> On 2014-1-8 3:34, John Hendrikx wrote:
>
>> Hi List,
>>
>> I'm in the process of adding CSS metadata to a new control, and I noticed
>> there is a lot of boilerplate.
>>
>> In order to reduce this, I've created some custom classes
>> StyleableProperty classes (SimpleStyleableXXXProperty), which reduces the
>> boilerplate significantly without sacrificing much (if any) performance.
>> The only thing that I cannot easily provide in this fashion is the static
>> getClassCssMetaData method. From the documentation I understand it is
>> there just for convience for subclass creators and is not used by the CSS
>> engine at all -- atleast, everything seems to work.
>>
>> The shortened version for CSS aware properties basically looks like:
>>
>> private final SimpleStyleableDoubleProperty cellAlignment = new
>> SimpleStyleableDoubleProperty(this, "cellAlignment",
>> "-fx-cell-alignment", 0.8);
>> private final SimpleStyleableDoubleProperty density= new
>> SimpleStyleableDoubleProperty(this, "density", "-fx-density", 0.02);
>> private final SimpleStyleableBooleanProperty reflectionEnabled= new
>> SimpleStyleableBooleanProperty(this, "reflectionEnabled",
>> "-fx-reflection-enabled", true);
>> private final SimpleStyleableBooleanProperty clipReflections= new
>> SimpleStyleableBooleanProperty(this, "clipReflections",
>> "-fx-clip-reflections", true);
>>
>> With one small bit of supporting code in the relevant class (Skin or
>> Control), which is basically a non-static implementation of the standard
>> CSS List example code:
>>
>> private static List<CssMetaData<? extends Styleable, ?>> cssMetaData;
>>
>> @Override
>> public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() { //
>> Unsynchronized. WC: list gets initialized multiple times.
>> if(cssMetaData == null) {
>> List<CssMetaData<? extends Styleable, ?>> metaData = new
>> ArrayList<>(super.getCssMetaData());
>> Collections.addAll(metaData,
>> cellAlignment.getCssMetaData(),
>> density.getCssMetaData(),
>> reflectionEnabled.getCssMetaData(),
>> clipReflections.getCssMetaData()
>> );
>> cssMetaData = Collections.unmodifiableList(metaData);
>> }
>>
>> return cssMetaData;
>> }
>>
>> Note that the List is static and lazy-final. The same goes for the
>> getCssMetaData method in the SimpleStyleableXXXProperty classes. There is
>> a slight performance decrease in those classes as getCssMetaData is looked
>> up from a static Map (indexed by Class + css property name) and lazily
>> created as needed -- a Map lookup however should be quite fast enough.
>>
>> I'm sure the design had good reason to do things as they are, and I'm
>> wondering if reducing the boilerplate has left me missing something
>> important.
>>
>> I welcome any insights!
>>
>> --John
>>
>
>
>
More information about the openjfx-dev
mailing list