<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Nir,</p>
<p>I got this mainly from non-public API Region#boundedSize</p>
<p>Node#minWidth and Node#maxWidth do document their respective
behaviors, but Node#prefWidth doesn't very explicitly state that
it is clamped to min/max.</p>
<p>--John<br>
</p>
<div class="moz-cite-prefix">On 10/11/2025 00:34, Nir Lisker wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CA+0ynh-SE7wWiewcY_GJ1T64NZr78XV6hw68GVuguSFhAuqXsQ@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<p style="scrollbar-color: rgb(69, 74, 77) rgb(32, 35, 36);">When
it comes to size priorities (min, pref and max), minimum
always wins, then comes maximum, then comes preferred.</p>
- min/pref/max height are 20/20/20<br
style="scrollbar-color: rgb(69, 74, 77) rgb(32, 35, 36);">
- you set minimum to 6<br
style="scrollbar-color: rgb(69, 74, 77) rgb(32, 35, 36);">
- end result: pref height wins with 20 as it is within the
range [min, max]<br
style="scrollbar-color: rgb(69, 74, 77) rgb(32, 35, 36);">
- you also set maximum to 1<br
style="scrollbar-color: rgb(69, 74, 77) rgb(32, 35, 36);">
- end result: pref height is now outside the min/max range, so
it is ignored; max is smaller than min, so it is ignored; min
wins with 6</blockquote>
<div><br>
</div>
<div>Is this documented somewhere? I'd think it would answer a
lot of confusing questions. </div>
</div>
<br>
<div class="gmail_quote gmail_quote_container">
<div dir="ltr" class="gmail_attr">On Sun, Nov 9, 2025 at 8:50 PM
John Hendrikx <<a href="mailto:john.hendrikx@gmail.com"
moz-do-not-send="true" class="moz-txt-link-freetext">john.hendrikx@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Hi,</p>
<p>Normally a cell will have computed values for each of the
min/pref/max. In your example, you were resetting the
cells to USE_PREF_SIZE, but it makes little difference in
the reasoning. All the size of a cell control (which is a
label) will be the label's size to display its text. Its
preferred height will be say 20. Its minimum will also be
20 to avoid cuts off. Its maximum will be 20 because
there is no reason for it to take up more space. Those are
the computes sizes. If you change all to USE_PREF_SIZE,
nothing changes (since pref is 20, min and max will copy
that). So:<br>
</p>
<p>- min/pref/max height are 20/20/20<br>
- you set minimum to 6<br>
- end result: pref height wins with 20 as it is within the
range [min, max]<br>
- you also set maximum to 1<br>
- end result: pref height is now outside the min/max
range, so it is ignored; max is smaller than min, so it is
ignored; min wins with 6<br>
</p>
<p>If you however set minimum to USE_PREF_SIZE (as was done
in your original code) or set it to 1, then you can use
the pref size to change it. Either because 1 is smaller
than the pref size, and so changing pref size to a smaller
value won't make it go out of range; or in the
USE_PREF_SIZE case, because min will simply track the pref
size value and always change with it.</p>
<p>--John</p>
<div>On 09/11/2025 03:44, Cormac Redmond wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_default"
style="font-family:verdana,sans-serif">Hi John,</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">Thanks for
the reply & details. One remaining question in
my previous mail however, was why a max <b>needs</b> to
be set for min to "win"...this still didn't make
sense.</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">Similarly,
I had already tried prefHeight on its own, but it
has no effect (unless it's set to number higher
than the computed size of the cell, in which case
it would increase the size). Setting prefHeight
and minHeight together though, can achieve setting
a "max height" though, just like setting a
maxHeight and minHeight as per my previous mail.</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">
<div class="gmail_default"><br>
</div>
<div class="gmail_default">But I've noticed that
values prefHeight, minHeight, maxHeight are all
defaulted to USE_COMPUTED_SIZE (-1)..., <b>not
USE_PREF_SIZE</b> as you mentioned, and I
assumed.</div>
<div class="gmail_default"><br>
</div>
<div class="gmail_default">So this explains the
above behaviour and why several need to be set:
otherwise computed size wins one way or another.</div>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">Although
confusing initially, I assume there's no bug here
and that the developer needs to always check the
underlying nature of how pref/min/max default
values are set for any node, in order to know what
and how to override their settings...?</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">If you want
some validation, you can see these -1 defaults,
via a simpler example:</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"><font size="1"
face="monospace">public class ComboBoxHeightBug2
extends Application {<br>
public static void main(String[] args) {<br>
launch(args);<br>
}<br>
<br>
public void start(Stage stage) {<br>
ComboBox<Object> cb = new
ComboBox<>();<br>
cb.getItems().addAll("Apple", "Banana",
"Carrot", "Lettuce");<br>
cb.setCellFactory(_ -> new
ListCell<>() {<br>
protected void updateItem(Object
item, boolean empty) {<br>
super.updateItem(item, empty);<br>
if (empty || item == null) {<br>
setText(null);<br>
setGraphic(null);<br>
} else if (item instanceof
Separator) {<br>
setText(null);<br>
setGraphic((Separator)
item);<br>
setDisable(true);<br>
} else {<br>
System.out.println("minHeight: " +
getMinHeight()); // -1<br>
System.out.println("maxHeight: " +
getMaxHeight()); // -1<br>
System.out.println("prefHeight: " +
getPrefHeight()); // -1<br>
setText(item.toString());<br>
setGraphic(null);<br>
setStyle("");<br>
}<br>
}<br>
});<br>
<br>
cb.getSelectionModel().selectFirst();<br>
stage.setScene(new Scene(cb, 200, 100));<br>
stage.show();<br>
}<br>
}</font></div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">Kind
Regards,</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif">Cormac</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
<div class="gmail_default"
style="font-family:verdana,sans-serif"><br>
</div>
</div>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Sun, 9 Nov 2025
at 00:06, John Hendrikx <<a
href="mailto:john.hendrikx@gmail.com"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">john.hendrikx@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote"
style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>What you are likely seeing is that the
minimum always wins over the other values.</p>
<p>The minimum height is set to the constant <span
class="gmail_default"
style="font-family:verdana,sans-serif"></span>USE_PREF_SIZE,
which means that it will take the preferred
size for the minimum height.</p>
<p>When it comes to size priorities (min, pref
and max), minimum always wins, then comes
maximum, then comes preferred.</p>
<p>So in this case, the preferred size is say
20. The minimum follows the preferred, also
20. You set maximum to 1. Minimum >
Maximum, so Maximum is ignored.</p>
<p>What you could try is set preferred size
smaller instead; there should be no need to
change minimum or maximum then.</p>
<p>--John<br>
</p>
<div>On 08/11/2025 21:30, Cormac Redmond wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div style="font-family:verdana,sans-serif">Hi,</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">I
have found a height bug when I am trying
to reduce the height of one ComboBox item
(a Separator) in a simple ComboBox.</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">One
would expect that to achieve this, you'd
set the maximum height for that particular
ListCell; but this has no effect.</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">Instead
what I need to do is set the <i>minimum</i>
height (but to the value I wish to be the
maximum height), and I must <b>also </b>set
the <i>maximum </i>height to any value
(if I do not, my minimum height (i.e., my
desired maximum) gets ignored)...</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">For
example, if I want the maximum height of
this Separator to be 6, I must set the
minimum height to 6 and I must set the
maximum height to anything, even 1.</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">Obviously
this is counter-intuitive and doesn't
make any logical sense.</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">Example
to reproduce (running from JFX master
branch):</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div><font face="monospace"><span
class="gmail_default"
style="font-family:verdana,sans-serif"></span>public
class ComboBoxHeightBug extends
Application {<br>
public static void main(String[]
args) {<br>
launch(args);<br>
}<br>
<br>
public void start(Stage stage) {<br>
ComboBox<Object> cb = new
ComboBox<>();<br>
cb.getItems().addAll("Apple",
"Banana", </font> <span
style="font-family:monospace">new
Separator()</span> <font
face="monospace">, "Carrot", "Lettuce");<br>
cb.setCellFactory(_ -> new
ListCell<>() {<br>
protected void
updateItem(Object item, boolean empty) {<br>
super.updateItem(item,
empty);<br>
if (empty || item ==
null) {<br>
setText(null);<br>
setGraphic(null);<br>
setStyle("");<br>
</font><span style="font-family:monospace">
// Set back to default</span><br
style="font-family:monospace">
<font face="monospace">
setMinHeight(USE_PREF_SIZE);<br>
setMaxHeight(Double.MAX_VALUE);<br>
} else if (item
instanceof Separator) {<br>
setText(null);<br>
setGraphic((Separator) item);<br>
setDisable(true);<br>
setMinHeight(6); //
This is required for any "max height" to
apply, and appears to be the value that
is used to determine height<br>
setMaxHeight(1); //
Setting this (to 6) should work on its
own, it doesn't, the value appears
irrelevant -- but it MUST be set to get
the separator height to be 6<br>
} else {<br>
setText(item.toString());<br>
setGraphic(null);<br>
setStyle("");<br>
// Set back to
default<br>
setMinHeight(USE_PREF_SIZE);<br>
setMaxHeight(Double.MAX_VALUE);<br>
}<br>
}<br>
});<br>
<br>
cb.getSelectionModel().selectFirst();<br>
stage.setScene(new Scene(cb,
200, 100));<br>
stage.show();<br>
}<br>
}</font></div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">Note:
I have noticed a few issues like this in
general, whereby it requires trial and
error to get <i>some</i> desired height to
apply; without any apparent logic as to
how these values are being arrived at or
how they're triggered to be used (I have
logged bugs before on this)...</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif"><br>
</div>
<div style="font-family:verdana,sans-serif">Kind
Regards,</div>
<div style="font-family:verdana,sans-serif">Cormac</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</body>
</html>