<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Nir,</p>
<p>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.</p>
<p>ScrollPane#viewportBoundsProperty seems to be such a property
that you better not bind to something else layout related.</p>
<p>--John<br>
</p>
<div class="moz-cite-prefix">On 09/02/2024 15:48, Nir Lisker wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CA+0ynh-am2+K+Um3O9cMCVOP9iiek3v1iz5=wcWZSjA-rp1DUw@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="auto">
<div dir="auto">You're thinking about the docs of the note in
the bounds properties I think:</div>
<div dir="auto"><br>
</div>
<a
href="https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInLocalProperty()"
target="_blank" rel="noreferrer" moz-do-not-send="true"
class="moz-txt-link-freetext">https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInLocalProperty()</a>
<div dir="auto"><a
href="https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInParentProperty()"
moz-do-not-send="true" class="moz-txt-link-freetext">https://openjfx.io/javadoc/21/javafx.graphics/javafx/scene/Node.html#boundsInParentProperty()</a></div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Fri, Feb 9, 2024, 03:28
John Hendrikx <<a href="mailto:john.hendrikx@gmail.com"
target="_blank" rel="noreferrer" moz-do-not-send="true"
class="moz-txt-link-freetext">john.hendrikx@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I'm pretty sure I read somewhere in JavaFX docs, code or
website that <br>
binding certain properties which are changed during layout is
a really <br>
bad idea, but I can't find where I've seen this. Anyone know
what I mean?<br>
<br>
It was something like: binding the values of a property like <br>
width/height which are changed during layout to another
property (which <br>
may in turn affect layout) should not be done, and one should
be using <br>
properties like min/pref/max width/height.<br>
<br>
The reason I ask is because I'm running into a weird problem
where I'm <br>
binding the value of ScrollPane.viewportBoundsProperty.width
to a <br>
Label's text property. What I noticed is that the Label
simply is not <br>
updating correctly, and will display the correct value **BUT**
use the <br>
previous value for its width calculation which causes the text
to not <br>
fit -- the fact that it is displayed wrong is especially
obvious when <br>
the Label's value switches between values like "312.0" and <br>
"313.333333333" where the 2nd value often gets an ellipsis
(like <br>
"31...") because its width was computed based on "312.0".
What I see <br>
happening is this:<br>
<br>
- A splitpane is resized (with a scrollpane in it)<br>
- The ScrollPane's viewportBoundsProperty changes (in
layoutChildren <br>
code of ScrollPaneSkin), so layout is already running...<br>
- A binding on viewportBoundsProperty.width updates the label
text from <br>
"312.0" to "313.33333333"<br>
<br>
However, before that binding is executed, I see a call to <br>
`computePrefWidth` on the Label, which uses the old text (ie.
"312.0") <br>
-- there is NO other call to computePrefWidth, so the layout
process <br>
continues with an incorrect width value...<br>
<br>
When later the layout code of the Label is called, it
concludes that the <br>
current width (based on the text "312.0") is insufficient to
display <br>
"313.33333333", and so adds an ellipsis...<br>
<br>
So, I'm thinking this may be "expected" behavior -- I'm
binding on a <br>
property that is updated during layout, and then making
another change <br>
(to Label.text) which in turn should trigger a new layout.
However, <br>
that doesn't happen, and it just runs in the current layout,
where it <br>
then uses part new, part old values (new text, but old width).<br>
<br>
Any insights are appreciated.<br>
<br>
--John<br>
<br>
<br>
</blockquote>
</div>
</blockquote>
</body>
</html>