<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>I think we need to be very careful in adjusting preferred size
based on scrollbar visibility.</p>
<p>ScrollPane's are used to avoid putting pressure on the
surrounding layout. It's preferred size will often be ignored in
most layouts because its preferred size is the size of its
content, which is likely too large too fit (otherwise why use a
ScrollPane). When a ScrollPane's bounds become smaller, it must be
careful not to change its minimum space requirements, as that
would be counter to its purpose.<br>
</p>
<p>However, even changing its preferred size when space is getting
tighter may affect layouts in a way you really want to avoid.
BorderPane is one of many layouts, and even though what we're
seeing may seem like a bug, changing this behavior may have
consequences. What if the ScrollPane is in a VBox with two
elements set to Priority.ALWAYS, one being the ScrollPane? When
space gets tighter, changing the preferred size to allow for a
scroll bar is going to make the layout jump a bit, because it will
take away a bit of extra space from the other element with
Priority.ALWAYS. VBox uses the preferred sizes of all children as
a starting point, and shrinks them to be smaller to fit --
changing the starting point (the preferred size) suddenly to make
room for a scroll bar is not going to be smooth.</p>
<p>I suspect in a lot of layouts the values for viewport
width/height will be set, as using the content as its preferred
size for a ScrollPane seems like a bad choice to begin with. In
the VBox example, the preferred size would be so large when there
is a lot of content that it would swallow most of the extra space
from any other nodes set to Priority.ALWAYS. Two ScrollPane's
above each other would not be equal sized, as their preferred
starting sizes would be based on their contents... it would look
weird without setting viewport size hints.</p>
<p>I could imagine that there could be a different scroll bar
policy, one where room is always reserved for scrollbars, but they
still display only when needed. This way, the ScrollPane, if it
can be displayed at its preferred size, would have sufficient room
for a horizontal scrollbar, and when it's horizontal size gets
squished, it can display it without needing to adjust its minimum
or preferred sizes. If there isn't enough room, it would pretty
much function as before, where the scrollbar overlays content when
it does need to be displayed -- that's unavoidable.<br>
</p>
<p>There's also a similar issue:
<a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8095135">https://bugs.openjdk.org/browse/JDK-8095135</a><br>
</p>
<p>--John<br>
</p>
<div class="moz-cite-prefix">On 01/05/2023 22:18, Andy Goryachev
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:DM5PR1001MB2172D6AEB286FDFF0A7B0B21E56E9@DM5PR1001MB2172.namprd10.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
{font-family:"Times New Roman \(Body CS\)";
panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
{font-family:"Helvetica Neue";
panose-1:2 0 5 3 0 0 0 2 0 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}span.EmailStyle18
{mso-style-type:personal-reply;
font-family:"Courier New";
color:windowtext;}p.p1, li.p1, div.p1
{mso-style-name:p1;
margin:0in;
font-size:10.0pt;
font-family:"Helvetica Neue";}span.s1
{mso-style-name:s1;
color:#DCA10D;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New"">I
think your diagnosis is right though: sometimes the layout
is not triggered when a property is changed,<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New"">the
recent bug like that is
<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="p1"><span class="s1"><a
href="https://bugs.openjdk.org/browse/JDK-8307117"
moz-do-not-send="true">JDK-8307117</a></span> TextArea:
wrapText property ignored when changing font<o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New"">I
wonder if some kind of a generic unit test could be
developed to identify such cases.<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New"">-andy<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Nir
Lisker <a class="moz-txt-link-rfc2396E" href="mailto:nlisker@gmail.com"><nlisker@gmail.com></a><br>
<b>Date: </b>Monday, May 1, 2023 at 13:09<br>
<b>To: </b>Andy Goryachev
<a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a><br>
<b>Cc: </b>openjfx-dev <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>[External] : Re: JDK-8199934:
ScrollPaneSkin incorrectly lays out its scrollbars<o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">If I
knew what the fix was I would have. Right now I'm not
sure anymore what the correct behavior should be even.<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">On
Mon, May 1, 2023 at 10:44 PM Andy Goryachev <<a
href="mailto:andy.goryachev@oracle.com"
moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>>
wrote:<o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC
1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">Nir, would
you like to submit a pull request?</span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New""> </span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">Thank you</span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">-andy</span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New""> </span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"
style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span
style="font-size:12.0pt;color:black">openjfx-dev
<<a
href="mailto:openjfx-dev-retn@openjdk.org"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">openjfx-dev-retn@openjdk.org</a>>
on behalf of Nir Lisker <<a
href="mailto:nlisker@gmail.com"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">nlisker@gmail.com</a>><br>
<b>Date: </b>Sunday, April 30, 2023 at 10:04<br>
<b>To: </b>openjfx-dev <<a
href="mailto:openjfx-dev@openjdk.org"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>><br>
<b>Subject: </b>JDK-8199934: ScrollPaneSkin
incorrectly lays out its scrollbars</span><span
style="font-size:11.0pt"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">Hi,<o:p></o:p></span></p>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">I took a quick jab
at this issue [1]. Using the reproducer in
the ticket, launch and resize the stage
vertically so that the buttons at the bottom
are only partially visible.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">The current
behavior is as follows:<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">When the scrollbar
is not needed, toggling to the AS_NEEDED
policy reallocates the scrollbar space for
the buttons (they move up).<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">When the scrollbar
is needed, toggling to the AS_NEEDED policy
still reallocates space, and the scrollbar
takes away space from the content node. This
is wrong.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">I modified the method
'computeHsbSizeHint' to<o:p></o:p></span></p>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">private double
computeHsbSizeHint(ScrollPane sp) {<br>
return determineHorizontalSBVisible()
?
hsb.prefHeight(ScrollBar.USE_COMPUTED_SIZE)
: 0;<br>
}<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">Now the policy
toggling behavior is correct both when the
scrollbar is needed and when it's not -
the space is reallocated not at the
expense of the content. However, enlarging
the stage horizontally while AS_NEEDED is
selected does not reallocate the space
(you need to toggle the policies). I'm
guessing there's a missing call to
layoutChildren during this resizing.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">Does anyone have
any input here?<o:p></o:p></span></p>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">Nir<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt">[1]
<a
href="https://bugs.openjdk.org/browse/JDK-8199934"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8199934</a><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"
style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt"> <o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</body>
</html>