Layout and property bindings question, what is allowed?

John Hendrikx john.hendrikx at gmail.com
Fri Feb 9 15:40:05 UTC 2024


Hi Nir,

Thanks, yes, those are what I was thinking about.  It seems to apply to 
more properties though, anything that is changed in a layout methods 
seems like a bad idea to bind to something else that may affect layout.

ScrollPane#viewportBoundsProperty seems to be such a property that you 
better not bind to something else layout related.

--John

On 09/02/2024 15:48, Nir Lisker wrote:
> You're thinking about the docs of the note in the bounds properties I 
> think:
>
> https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInLocalProperty() 
>
> https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInParentProperty()
>
> On Fri, Feb 9, 2024, 03:28 John Hendrikx <john.hendrikx at gmail.com> wrote:
>
>     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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20240209/cb7c5e1b/attachment.htm>


More information about the openjfx-dev mailing list