<!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>