Layout and property bindings question, what is allowed?
John Hendrikx
john.hendrikx at gmail.com
Fri Feb 9 01:28:02 UTC 2024
Hi,
I'm pretty sure I read somewhere in JavaFX docs, code or website that
binding certain properties which are changed during layout is a really
bad idea, but I can't find where I've seen this. Anyone know what I mean?
It was something like: binding the values of a property like
width/height which are changed during layout to another property (which
may in turn affect layout) should not be done, and one should be using
properties like min/pref/max width/height.
The reason I ask is because I'm running into a weird problem where I'm
binding the value of ScrollPane.viewportBoundsProperty.width to a
Label's text property. What I noticed is that the Label simply is not
updating correctly, and will display the correct value **BUT** use the
previous value for its width calculation which causes the text to not
fit -- the fact that it is displayed wrong is especially obvious when
the Label's value switches between values like "312.0" and
"313.333333333" where the 2nd value often gets an ellipsis (like
"31...") because its width was computed based on "312.0". What I see
happening is this:
- A splitpane is resized (with a scrollpane in it)
- The ScrollPane's viewportBoundsProperty changes (in layoutChildren
code of ScrollPaneSkin), so layout is already running...
- A binding on viewportBoundsProperty.width updates the label text from
"312.0" to "313.33333333"
However, before that binding is executed, I see a call to
`computePrefWidth` on the Label, which uses the old text (ie. "312.0")
-- there is NO other call to computePrefWidth, so the layout process
continues with an incorrect width value...
When later the layout code of the Label is called, it concludes that the
current width (based on the text "312.0") is insufficient to display
"313.33333333", and so adds an ellipsis...
So, I'm thinking this may be "expected" behavior -- I'm binding on a
property that is updated during layout, and then making another change
(to Label.text) which in turn should trigger a new layout. However,
that doesn't happen, and it just runs in the current layout, where it
then uses part new, part old values (new text, but old width).
Any insights are appreciated.
--John
More information about the openjfx-dev
mailing list