The trouble with Skins

John Hendrikx hjohn at
Sat Mar 21 16:01:58 UTC 2015

On 14/03/2015 08:31, Tom Eugelink wrote:
> Hi Tomas,
> I have looked into it, but not yet attempted, but I did do a lot of 
> custom controls. And I agree that it is dubious that a control is a 
> node, and has the properties that come with it. I try to maintain a 
> strict separation in my controls in JFXtras; controls only have 
> functional methods, the skin and CSS do all the layout. For example 
> the gauge I've ported from Enzo; my version does not have a 
> setFillColor() like the one in Enzo, that is something that the user 
> needs to do through CSS.
> That said, if a control were only a model, than it would not be a 
> control, right? We would create model-skins, so there is something 
> that differentiates a control from a model. To me that is an 
> abstraction of the skin. For example: not knowning HOW it is rendered, 
> a textbox does know that it can receive the focus, it is implicit to 
> what it is. So there is a certain logic for allowing controls to have 
> rudimentary rendering info, as long as it does not expose the actual 
> layout details.
> Looking at ListView, there is a logic in that a list can scroll, so 
> onScroll on the control makes sense. Whether that scrolling is done 
> via a scrollbar or buttons is a skin detail that should not leak out. 
> So the fact that ListView does not have a scroll position makes sense 
> to me.

As someone that has been tempted to write a new Control that replaces 
ListView atleast half a dozen times now because of restrictions or 
idioms that don't match my needs, I'd disagree.  A ListView doesn't need 
to scroll at all.  An application that isn't mouse or touchscreen 
controlled (keyboard or remote controlled for example) has zero need for 
scrollbars except maybe as information to show the relative size of the 

A List of items could be paged only, or they could flip.  I'd like to be 
able to take a List, and wrap it in a ScrollBarView... or in a 
PagerView, FlipOverView or CoverFlowView (with 30 new properties to set 
things like reflections, 3d parameters, distance between items, etc).   
It is possible to do this with Skins, but it feels like a hack rather 
than simply a different Look&Feel in the end.

  After all, a ListView is a container for an unbounded list of items.  
I can think of half a dozen ways of how that can be shown to the user, 
and the current ListView is just one way to do it.  The promise of Skins 
here is that I could just change the look & feel, but unfortunately way 
too many details of the "default" look & feel leak through in the 
Control itself.

> Tom
> On 14-3-2015 04:33, Tomas Mikula wrote:
>> A quick poll:
>> Has anyone ever implemented a custom skin for some of the more complex
>> controls like ListView, TableView, TreeView, TextArea?
>> The problem I have with the Control/Skin architecture is that a
>> Control, being a Node in the scene graph, cannot be a pure model (in
>> the MVC sense) - it is inherently a view (in the MVC sense). What is
>> the model of a check box? For me, a model of a check box is a boolean
>> property; certainly not something that has boundsInParent or
>> onZoomFinished properties. CheckBox is hardly a model. It is a view.
>> Everything in the scene graph is inherently a view.
>> There is this idea that the view aspect of a control is implemented by
>> the skin. The control itself does not know what the skin looks like or
>> even what skin class is used. So a ListView knows about its items, but
>> it does not know about its scroll position. But users sometimes want
>> to know the scroll position. Why should there be onScrollProperty, but
>> not way to get the current scroll position? Why should there be
>> TextArea.getBoundsInParent(), but not TextArea.getCaretBounds()? There
>> is no good way to implement the latter methods using custom skins. The
>> ListView or TextArea don't know anything about the skin, thus they
>> don't know anything about the current scroll position or caret bounds.
>> They cannot ask the skin, because there might be no skin yet, and even
>> if there is, all they know about it is that it is an instance of
>> Skin<?> - not much one can do with it (certainly not get caret
>> bounds).
>> I'm leaning more and more towards not supporting custom skins at all.
>> The whole idea of overriding skins via CSS looks to me like dependency
>> injection via CSS, except without any possibility to constrain the
>> type of what can be injected.
>> I would like to know the community opinion on this. Even hear your
>> success story how skins are awesome, if there is such.
>> Regards,
>> Tomas

More information about the openjfx-dev mailing list