<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Yes, sorry, it does mention that, and I missed it by mistake,
      late night programming I guess.</p>
    <p>--John<br>
    </p>
    <div class="moz-cite-prefix">On 12/07/2023 16:57, Kevin Rushforth
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:fe0264e3-5c4a-ee74-324a-e3e330baac3f@oracle.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      The updateItem docs [1] already say this. I had missed that the
      test program didn't do this, so thanks to Ajit for pointing it
      out.<br>
      <br>
      And yes, <a class="moz-txt-link-freetext"
        href="https://bugs.openjdk.org/browse/JDK-8090254"
        moz-do-not-send="true">https://bugs.openjdk.org/browse/JDK-8090254</a>
      should be closed as not an issue with a reference to the doc bug
      that clarified this.<br>
      <br>
      -- Kevin<br>
      <br>
      [1]
      <a class="moz-txt-link-freetext"
href="https://download.java.net/java/early_access/javafx21/docs/api/javafx.controls/javafx/scene/control/Cell.html#updateItem(T,boolean)"
        moz-do-not-send="true">https://download.java.net/java/early_access/javafx21/docs/api/javafx.controls/javafx/scene/control/Cell.html#updateItem(T,boolean)</a><br>
      <br>
      <div class="moz-cite-prefix">On 7/12/2023 7:50 AM, Andy Goryachev
        wrote:<br>
      </div>
      <blockquote type="cite"
cite="mid:DM5PR1001MB21722C85C7676C89EF724F59E536A@DM5PR1001MB2172.namprd10.prod.outlook.com">
        <meta name="Generator" content="Microsoft Word 15 (filtered
          medium)">
        <style>@font-face
        {font-family:Helvetica;
        panose-1:0 0 0 0 0 0 0 0 0 0;}@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:"Iosevka Fixed SS16";
        panose-1:2 0 5 9 3 0 0 0 0 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:"Iosevka Fixed SS16 ";
        panose-1:2 0 5 9 3 0 0 0 0 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}h3
        {mso-style-priority:9;
        mso-style-link:"Heading 3 Char";
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:13.5pt;
        font-family:"Calibri",sans-serif;
        font-weight:bold;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}span.apple-converted-space
        {mso-style-name:apple-converted-space;}span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Iosevka Fixed SS16";
        color:windowtext;}span.Heading3Char
        {mso-style-name:"Heading 3 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 3";
        font-family:"Calibri",sans-serif;
        font-weight:bold;}.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:"Iosevka Fixed
              SS16"">Ajit is right - perhaps javadoc for
              updateItem() should explicitly mention this?<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16""><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16"">Also, perhaps <a
                href="https://bugs.openjdk.org/browse/JDK-8090254"
                moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8090254</a>
              should be closed - we recently updated javadoc to read<o:p></o:p></span></p>
          <h3
style="mso-margin-top-alt:20.4pt;margin-right:0in;margin-bottom:3.0pt;margin-left:0in;background:#ECEBEC"><span
style="font-size:12.0pt;font-family:"Arial",sans-serif;color:black">Warning:
              Nodes should not be inserted directly into the items list<o:p></o:p></span></h3>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16""><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16"">(this is a different issue altogether)<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16""><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16"">-andy<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16""><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:11.0pt;font-family:"Iosevka Fixed
              SS16""><o:p> </o:p></span></p>
          <div id="mail-editor-reference-message-container">
            <div>
              <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">Ajit Ghaisas <a
                      class="moz-txt-link-rfc2396E"
                      href="mailto:ajit.ghaisas@oracle.com"
                      moz-do-not-send="true"><ajit.ghaisas@oracle.com></a><br>
                    <b>Date: </b>Wednesday, July 12, 2023 at 02:26<br>
                    <b>To: </b>John Hendrikx <a
                      class="moz-txt-link-rfc2396E"
                      href="mailto:john.hendrikx@gmail.com"
                      moz-do-not-send="true"><john.hendrikx@gmail.com></a><br>
                    <b>Cc: </b><a class="moz-txt-link-abbreviated
                      moz-txt-link-freetext"
                      href="mailto:openjfx-dev@openjdk.org"
                      moz-do-not-send="true">openjfx-dev@openjdk.org</a>
                    <a class="moz-txt-link-rfc2396E"
                      href="mailto:openjfx-dev@openjdk.org"
                      moz-do-not-send="true"><openjfx-dev@openjdk.org></a>,
                    Andy Goryachev <a class="moz-txt-link-rfc2396E"
                      href="mailto:andy.goryachev@oracle.com"
                      moz-do-not-send="true"><andy.goryachev@oracle.com></a><br>
                    <b>Subject: </b>Re: ListView with ImageViews for
                    cells very bugged?<o:p></o:p></span></p>
              </div>
              <p class="MsoNormal"><span style="font-size:10.5pt">Hi
                  John,</span><span style="font-size:11.0pt"><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:10.5pt"> 
                     This looks like a user code issue and not a JavaFX
                    bug.</span><span style="font-size:11.0pt"><o:p></o:p></span></p>
              </div>
              <div>
                <p class="MsoNormal"><span style="font-size:10.5pt"> 
                     Most of the vertical scrollbar issues that you have
                    mentioned get fixed by adding a call to
                    "super.updateItem(image, empty);" as a first call in
                    the cell factory method "<span
                      style="color:black;background:white">protected
                      void updateItem(Image image, boolean empty)</span>”</span><span
                    style="font-size:11.0pt"><o:p></o:p></span></p>
              </div>
              <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:10.5pt;color:black;background:white">I
                    am seeing an exception when I scroll fully down and
                    then scroll up by clicking empty area on the
                    vertical scrollbar. This looks like a separate issue
                    though.</span><span style="font-size:11.0pt"><o:p></o:p></span></p>
              </div>
              <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:10.5pt;color:black;background:white">Regards,</span><span
                    style="font-size:11.0pt"><o:p></o:p></span></p>
              </div>
              <div>
                <p class="MsoNormal"><span
                    style="font-size:10.5pt;color:black;background:white">Ajit</span><span
                    style="font-size:11.0pt"><o:p></o:p></span></p>
              </div>
              <div>
                <p class="MsoNormal" style="background:white"><span
                    style="font-size:12.0pt;font-family:"Courier
                    New";color:#080808"><o:p> </o:p></span></p>
              </div>
              <div>
                <div>
                  <p class="MsoNormal"><span style="font-size:11.0pt"><br>
                      <br>
                      <o:p></o:p></span></p>
                  <blockquote
                    style="margin-top:5.0pt;margin-bottom:5.0pt">
                    <div>
                      <p class="MsoNormal"><span
                          style="font-size:11.0pt">On 12-Jul-2023, at
                          5:18 AM, Andy Goryachev <a
                            class="moz-txt-link-rfc2396E"
                            href="mailto:andy.goryachev@oracle.com"
                            moz-do-not-send="true"><andy.goryachev@oracle.com></a>
                          wrote:<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;font-family:"Iosevka
                            Fixed SS16"">Thank you for the code
                            sample, John!</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">Had to replace loading
                            from https:// to a local <a
                              class="moz-txt-link-freetext"
                              href="file://" moz-do-not-send="true">file://</a>,
                            but I do see some of the issues you've
                            mentioned (on macOS):</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">2), 5), and 6).</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">There is also a new issue:</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">7) when the top of the
                            cell is outside of the view area, the image
                            is not shown at all (but the cell is sized
                            correctly).</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">All this is indeed weird. 
                            Looks like the time is right to create a
                            bug, unless it's this one:</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <table class="MsoNormalTable"
                        style="width:15.0in;background:white;border-collapse:collapse"
                        width="1440" cellspacing="0" cellpadding="0"
                        border="0">
                        <tbody>
                          <tr>
                            <td
                              style="width:12.0pt;border:none;border-bottom:solid
                              #C1C7D0
                              1.0pt;background:#EBECF0;padding:3.75pt
                              7.5pt 3.75pt 7.5pt" width="16"
                              valign="top" nowrap="nowrap">
                              <p class="MsoNormal"
                                style="margin-bottom:6.0pt"><span
style="font-size:10.5pt;font-family:"Arial",sans-serif;color:#172B4D"><a
href="https://bugs.openjdk.org/browse/JDK-8090254"
                                    moz-do-not-send="true"><span
                                      style="color:#0052CC">JDK-8090254</span></a></span><o:p></o:p></p>
                            </td>
                            <td style="border:none;border-bottom:solid
                              #C1C7D0
                              1.0pt;background:#EBECF0;padding:3.75pt
                              7.5pt 3.75pt 7.5pt" valign="top">
                              <div>
                                <p class="MsoNormal"><span
style="font-size:10.5pt;font-family:"Arial",sans-serif;color:#172B4D"><a
href="https://bugs.openjdk.org/browse/JDK-8090254"
                                      moz-do-not-send="true"><span
                                        style="color:#0052CC">[ListView]
                                        page up/down navigation doesn't
                                        work, when items are large
                                        (again!)</span></a></span><o:p></o:p></p>
                              </div>
                            </td>
                          </tr>
                        </tbody>
                      </table>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16"">-andy</span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal"><span
                            style="font-size:11.0pt;font-family:"Iosevka
                            Fixed SS16""> </span><o:p></o:p></p>
                      </div>
                      <div id="mail-editor-reference-message-container">
                        <div>
                          <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">From:<span
                                    class="apple-converted-space"> </span></span></b><span
                                style="font-size:12.0pt">openjfx-dev <a
                                  class="moz-txt-link-rfc2396E"
                                  href="mailto:openjfx-dev-retn@openjdk.org"
                                  moz-do-not-send="true"><openjfx-dev-retn@openjdk.org></a>
                                on behalf of John Hendrikx <a
                                  class="moz-txt-link-rfc2396E"
                                  href="mailto:john.hendrikx@gmail.com"
                                  moz-do-not-send="true"><john.hendrikx@gmail.com></a><br>
                                <b>Date:<span
                                    class="apple-converted-space"> </span></b>Tuesday,
                                July 11, 2023 at 16:34<br>
                                <b>To:<span
                                    class="apple-converted-space"> </span></b><a
                                  class="moz-txt-link-abbreviated
                                  moz-txt-link-freetext"
                                  href="mailto:openjfx-dev@openjdk.org"
                                  moz-do-not-send="true">openjfx-dev@openjdk.org</a>
                                <a class="moz-txt-link-rfc2396E"
                                  href="mailto:openjfx-dev@openjdk.org"
                                  moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
                                <b>Subject:<span
                                    class="apple-converted-space"> </span></b>Re:
                                ListView with ImageViews for cells very
                                bugged?</span><o:p></o:p></p>
                          </div>
                          <p><span
                              style="font-size:9.0pt;font-family:Helvetica">I
                              said I'd do it tomorrow, but here is a
                              full example anyway with pre-loaded
                              images, and without external dependencies:<o:p></o:p></span></p>
                          <p><span
                              style="font-size:9.0pt;font-family:Helvetica"> <o:p></o:p></span></p>
                          <p><span
                              style="font-size:9.0pt;font-family:Helvetica">package
                              org.int4.sdui.ui;<br>
                              <br>
                              import javafx.application.Application;<br>
                              import javafx.scene.Scene;<br>
                              import javafx.scene.control.Button;<br>
                              import javafx.scene.control.ListCell;<br>
                              import javafx.scene.control.ListView;<br>
                              import javafx.scene.control.TextArea;<br>
                              import javafx.scene.image.Image;<br>
                              import javafx.scene.image.ImageView;<br>
                              import javafx.scene.layout.HBox;<br>
                              import javafx.scene.layout.Priority;<br>
                              import javafx.scene.layout.VBox;<br>
                              import javafx.stage.Stage;<br>
                              <br>
                              public class Main2 {<br>
                              <br>
                                public static void main(String[] args) {<br>
                                  Application.launch(UI.class, args);<br>
                                }<br>
                              <br>
                                public static class UI extends
                              Application {<br>
                              <br>
                                  @Override<br>
                                  public void start(Stage primaryStage)
                              throws InterruptedException {<br>
                                    Image image1 = new Image(<a
                                href="https://picsum.photos/512/512"
                                moz-do-not-send="true">"https://picsum.photos/512/512"</a>);<br>
                                    Image image2 = new Image(<a
                                href="https://picsum.photos/512/512"
                                moz-do-not-send="true">"https://picsum.photos/512/512"</a>);<br>
                              <br>
                                    TextArea prompt = new TextArea("a
                              flower on Mars");<br>
                                    Button button = new
                              Button("Submit");<br>
                                    ListView<Image> listView = new
                              ListView<>();<br>
                              <br>
                                    while(image1.isBackgroundLoading()
                              || image2.isBackgroundLoading()) {<br>
                                      Thread.sleep(100);<br>
                                    }<br>
                              <br>
                                    listView.getItems().addAll(image1,
                              image2);<br>
                                    listView.setCellFactory(lv -> {<br>
                                      final ImageView imageView = new
                              ImageView();<br>
                              <br>
                                      return new ListCell<>() {<br>
                                        protected void updateItem(Image
                              image, boolean empty) {<br>
                                          if(empty) {<br>
                                            setGraphic(null);<br>
                                          }<br>
                                          else {<br>
                                            imageView.setImage(image);<br>
                                            setGraphic(imageView);<br>
                                          }<br>
                                        }<br>
                                      };<br>
                                    });<br>
                              <br>
                                    HBox hbox = new HBox() {{<br>
                                      getChildren().addAll(<br>
                                        new VBox() {{<br>
                                          getChildren().addAll(prompt,
                              button);<br>
                                        }},<br>
                                        listView<br>
                                      );<br>
                                    }};<br>
                              <br>
                                    HBox.setHgrow(listView,
                              Priority.ALWAYS);<br>
                              <br>
                                    Scene scene = new Scene(hbox);<br>
                              <br>
                                    primaryStage.setScene(scene);<br>
                                    primaryStage.show();<br>
                                  }<br>
                                }<br>
                              }<br>
                              <br>
                              <br>
                              <br>
                              <br>
                              <br>
                              --John<o:p></o:p></span></p>
                          <div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt">On 12/07/2023
                                  01:17, Andy Goryachev wrote:</span><o:p></o:p></p>
                            </div>
                          </div>
                          <blockquote
                            style="margin-top:5.0pt;margin-bottom:5.0pt">
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 "">I'll need to
                                  replicate this scenario to be able to
                                  say anything definitive.</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 "">Just by looking at
                                  the cell factory code though, I
                                  suspect there might be some async
                                  processing around</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt">new
                                  ImageView(new Image(new<span
                                    class="apple-converted-space"> </span><br>
                                  >
                                  ByteArrayInputStream(imageHandle.getImageData()))));</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 "">which might cause
                                  the issue.</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 "">Could you try
                                  pre-loading images?</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 "">-andy</span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div>
                              <p class="MsoNormal"><span
                                  style="font-size:11.0pt;font-family:"Iosevka
                                  Fixed SS16 ""> </span><o:p></o:p></p>
                            </div>
                            <div
                              id="mail-editor-reference-message-container">
                              <div>
                                <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">From:<span
                                          class="apple-converted-space"> </span></span></b><span
                                      style="font-size:12.0pt">openjfx-dev<span
                                        class="apple-converted-space"> </span><a
href="mailto:openjfx-dev-retn@openjdk.org" moz-do-not-send="true"><openjfx-dev-retn@openjdk.org></a><span
                                        class="apple-converted-space"> </span>on
                                      behalf of Kevin Rushforth<span
                                        class="apple-converted-space"> </span><a
href="mailto:kevin.rushforth@oracle.com" moz-do-not-send="true"><kevin.rushforth@oracle.com></a><br>
                                      <b>Date:<span
                                          class="apple-converted-space"> </span></b>Tuesday,
                                      July 11, 2023 at 15:58<br>
                                      <b>To:<span
                                          class="apple-converted-space"> </span></b><a
href="mailto:openjfx-dev@openjdk.org" moz-do-not-send="true"
                                        class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a><span
                                        class="apple-converted-space"> </span><a
href="mailto:openjfx-dev@openjdk.org" moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
                                      <b>Subject:<span
                                          class="apple-converted-space"> </span></b>Re:
                                      ListView with ImageViews for cells
                                      very bugged?</span><o:p></o:p></p>
                                </div>
                                <div>
                                  <p class="MsoNormal"
                                    style="margin-bottom:12.0pt"><span
                                      style="font-size:11.0pt">What you
                                      have should work, but will create
                                      redundant images and<span
                                        class="apple-converted-space"> </span><br>
                                      ImageView ojbects. The
                                      recommendation is to create the
                                      nodes (ImageView<span
                                        class="apple-converted-space"> </span><br>
                                      in this case) in the constructor
                                      of the cell factory and call
                                      setGraphic<span
                                        class="apple-converted-space"> </span><br>
                                      with either null or that factory's
                                      node.<br>
                                      <br>
                                      Having said that, I doubt that
                                      this is related to the visual
                                      problems<span
                                        class="apple-converted-space"> </span><br>
                                      you are seeing. Maybe Ajit or Andy
                                      have some ideas.<br>
                                      <br>
                                      -- Kevin<br>
                                      <br>
                                      <br>
                                      On 7/11/2023 3:50 PM, John
                                      Hendrikx wrote:<br>
                                      > I tend to avoid ListView,
                                      because for some reason it seems
                                      to just<span
                                        class="apple-converted-space"> </span><br>
                                      > never do what I want unless
                                      used for its mundane rows of text
                                      use<span
                                        class="apple-converted-space"> </span><br>
                                      > case. I so far always just
                                      implemented my own skin for
                                      ListView that<span
                                        class="apple-converted-space"> </span><br>
                                      > deals with displays that have
                                      many images that need to scroll<span
                                        class="apple-converted-space"> </span><br>
                                      > smoothly, but...<br>
                                      ><br>
                                      > Recently, I've again
                                      attempted to use ListView, this
                                      time for showing<span
                                        class="apple-converted-space"> </span><br>
                                      > (so far) fixed size
                                      ImageViews with images exactly
                                      512x512 pixels in<span
                                        class="apple-converted-space"> </span><br>
                                      > size:<br>
                                      ><br>
                                      > The cell factory looks like
                                      this, which I think is a correct<span
                                        class="apple-converted-space"> </span><br>
                                      > implementation:<br>
                                      ><br>
                                      >      
                                      listView.setCellFactory(lv -> {<br>
                                      >         return new
                                      ListCell<>() {<br>
                                      >           protected void
                                      updateItem(ImageHandle
                                      imageHandle, boolean<span
                                        class="apple-converted-space"> </span><br>
                                      > empty) {<br>
                                      >             if(empty) {<br>
                                      >              
                                      setGraphic(null);<br>
                                      >             }<br>
                                      >             else {<br>
                                      >               try {<br>
                                      >                
                                      setGraphic(new ImageView(new
                                      Image(new<span
                                        class="apple-converted-space"> </span><br>
                                      >
                                      ByteArrayInputStream(imageHandle.getImageData()))));<br>
                                      >               }<br>
                                      >              
                                      catch(IOException e) {<br>
                                      >                
                                      e.printStackTrace();<br>
                                      >               }<br>
                                      >             }<br>
                                      >           }<br>
                                      >         };<br>
                                      >       });<br>
                                      ><br>
                                      > Now, this is with JavaFX
                                      21-ea-24 (but also happens on
                                      19).  I spotted<span
                                        class="apple-converted-space"> </span><br>
                                      > the following IMHO bugs:<br>
                                      ><br>
                                      > 1) When the ImageView is so
                                      large that a single row is only
                                      partially<span
                                        class="apple-converted-space"> </span><br>
                                      > visible, the scrollbar is
                                      incorrect (it shows a full bar,
                                      even if half<span
                                        class="apple-converted-space"> </span><br>
                                      > of a row is displayed).<br>
                                      ><br>
                                      > 2) The vertical scrollbar
                                      doesn't respond to a click in the
                                      non-thumb<span
                                        class="apple-converted-space"> </span><br>
                                      > area at all (you'd expect to
                                      make it scroll a page up or down
                                      that way)<br>
                                      ><br>
                                      > 3) When jerkily resizing the
                                      window, I can sometimes have a
                                      vertical +<span
                                        class="apple-converted-space"> </span><br>
                                      > horizontal scrollbar when
                                      there's a full row visible +
                                      anywhere from 0<span
                                        class="apple-converted-space"> </span><br>
                                      > to 10 extra empty pixels
                                      (probably the potential height of
                                      a<span
                                        class="apple-converted-space"> </span><br>
                                      > horizontal scrollbar) with
                                      the vertical scroll bar still
                                      visible.  The<span
                                        class="apple-converted-space"> </span><br>
                                      > algorithm to hide the
                                      scrollbar apparently is not
                                      deterministic and<span
                                        class="apple-converted-space"> </span><br>
                                      > depends on mouse movement
                                      speed.<br>
                                      ><br>
                                      > 4) When a row is less than
                                      half visible, scrolling the window
                                      down to<span
                                        class="apple-converted-space"> </span><br>
                                      > another ImageView will jump
                                      the view and hide the first cell
                                      that<span
                                        class="apple-converted-space"> </span><br>
                                      > should still be visible for
                                      the bottom 0-49% of its height.<br>
                                      ><br>
                                      > 5) It's possible to get the
                                      vertical scroll bar in such a
                                      state that<span
                                        class="apple-converted-space"> </span><br>
                                      > it doesn't respond to the
                                      mouse any more at all, even by
                                      dragging the<span
                                        class="apple-converted-space"> </span><br>
                                      > thumb.  Some keyboard action
                                      and mouse scrolling sometimes
                                      restores it<span
                                        class="apple-converted-space"> </span><br>
                                      > to relatively normal
                                      functioning.<br>
                                      ><br>
                                      > 6) Mouse wheel scrolling acts
                                      weird.  With one large cell
                                      visible and<span
                                        class="apple-converted-space"> </span><br>
                                      > two rows available, scrolling
                                      only **down** on the mouse wheel
                                      will<span
                                        class="apple-converted-space"> </span><br>
                                      > scroll down, then jump back
                                      up, and scroll down again... it's<span
                                        class="apple-converted-space"> </span><br>
                                      > impossible to scroll all the
                                      way down to get to a point where
                                      it stops<span
                                        class="apple-converted-space"> </span><br>
                                      > scrolling as it keeps jumping
                                      back.<br>
                                      ><br>
                                      > This is with ImageView's.  I
                                      suppose they're known to have
                                      problems...<span
                                        class="apple-converted-space"> </span><br>
                                      > but then I switched to a
                                      Region, which contain an ImageView
                                      with<span
                                        class="apple-converted-space"> </span><br>
                                      > proper min/pref/max
                                      implementations.  This improved
                                      the situation<span
                                        class="apple-converted-space"> </span><br>
                                      > somewhat.  The scrollbar was
                                      much more reliable, but I still
                                      saw<span
                                        class="apple-converted-space"> </span><br>
                                      > almost all of the above
                                      issues, but somewhat more reliable
                                      than<span
                                        class="apple-converted-space"> </span><br>
                                      > before.  Still rows would
                                      disappear when (for the most part)<span
                                        class="apple-converted-space"> </span><br>
                                      > invisible, those and the
                                      jumps of the view are just totally
                                      unacceptable.<br>
                                      ><br>
                                      > I'm not quite sure what to
                                      make of this, it seems the control
                                      is not<span
                                        class="apple-converted-space"> </span><br>
                                      > meant for arbitrary graphics.<br>
                                      ><br>
                                      > --John<br>
                                      ><br>
                                      ><br>
                                      ><br>
                                      > package org.int4.sdui.ui;<br>
                                      ><br>
                                      > import
                                      hs.mediasystem.util.image.ImageHandle;<br>
                                      > import
                                      hs.mediasystem.util.javafx.control.Containers;<br>
                                      ><br>
                                      > import
                                      java.io.ByteArrayInputStream;<br>
                                      > import java.io.IOException;<br>
                                      > import java.util.Base64;<br>
                                      > import java.util.List;<br>
                                      ><br>
                                      > import
                                      javafx.application.Application;<br>
                                      > import javafx.scene.Scene;<br>
                                      > import
                                      javafx.scene.control.Button;<br>
                                      > import
                                      javafx.scene.control.ListCell;<br>
                                      > import
                                      javafx.scene.control.ListView;<br>
                                      > import
                                      javafx.scene.control.TextArea;<br>
                                      > import
                                      javafx.scene.image.Image;<br>
                                      > import
                                      javafx.scene.image.ImageView;<br>
                                      > import
                                      javafx.scene.layout.HBox;<br>
                                      > import
                                      javafx.scene.layout.Priority;<br>
                                      > import javafx.stage.Stage;<br>
                                      ><br>
                                      > import
                                      kong.unirest.core.Unirest;<br>
                                      ><br>
                                      > public class Main {<br>
                                      ><br>
                                      >   public static void
                                      main(String[] args) {<br>
                                      >    
                                      Application.launch(UI.class,
                                      args);<br>
                                      >   }<br>
                                      ><br>
                                      >   public static class UI
                                      extends Application {<br>
                                      ><br>
                                      >     @Override<br>
                                      >     public void start(Stage
                                      primaryStage) {<br>
                                      >       TextArea prompt = new
                                      TextArea("a flower on Mars");<br>
                                      >       Button button = new
                                      Button("Submit");<br>
                                      >      
                                      ListView<ImageHandle>
                                      listView = new ListView<>();<br>
                                      ><br>
                                      >      
                                      listView.setCellFactory(lv -> {<br>
                                      >         return new
                                      ListCell<>() {<br>
                                      >           protected void
                                      updateItem(ImageHandle
                                      imageHandle, boolean<span
                                        class="apple-converted-space"> </span><br>
                                      > empty) {<br>
                                      >             if(empty) {<br>
                                      >              
                                      setGraphic(null);<br>
                                      >             }<br>
                                      >             else {<br>
                                      >               try {<br>
                                      >                
                                      setGraphic(new ImageView(new
                                      Image(new<span
                                        class="apple-converted-space"> </span><br>
                                      >
                                      ByteArrayInputStream(imageHandle.getImageData()))));<br>
                                      >               }<br>
                                      >              
                                      catch(IOException e) {<br>
                                      >                
                                      e.printStackTrace();<br>
                                      >               }<br>
                                      >             }<br>
                                      >           }<br>
                                      >         };<br>
                                      >       });<br>
                                      ><br>
                                      >       button.setOnAction(e
                                      -> {<br>
                                      >         Txt2ImgResponse
                                      response =
                                      textToImage(prompt.getText());<br>
                                      ><br>
                                      >         for(String image :
                                      response.images) {<br>
                                      >          
                                      listView.getItems().add(new<span
                                        class="apple-converted-space"> </span><br>
                                      >
                                      InMemoryImageHandle(Base64.getDecoder().decode(image)));<br>
                                      >         }<br>
                                      >       });<br>
                                      ><br>
                                      >       HBox hbox =
                                      Containers.hbox(Containers.vbox(prompt,
                                      button),<span
                                        class="apple-converted-space"> </span><br>
                                      > listView);<br>
                                      ><br>
                                      >       HBox.setHgrow(listView,
                                      Priority.ALWAYS);<br>
                                      ><br>
                                      >       Scene scene = new
                                      Scene(hbox);<br>
                                      ><br>
                                      >      
                                      primaryStage.setScene(scene);<br>
                                      >       primaryStage.show();<br>
                                      >     }<br>
                                      ><br>
                                      >     private Txt2ImgResponse
                                      textToImage(String prompt) {<br>
                                      >       return Unirest.post("<a
href="http://127.0.0.1:7860/sdapi/v1/txt2img" moz-do-not-send="true"
                                        class="moz-txt-link-freetext">http://127.0.0.1:7860/sdapi/v1/txt2img</a>")<br>
                                      >         .body(new
                                      Txt2Img(prompt, 5))<br>
                                      >        
                                      .contentType("application/json")<br>
                                      >        
                                      .asObject(Txt2ImgResponse.class)<br>
                                      >         .getBody();<br>
                                      >     }<br>
                                      >   }<br>
                                      ><br>
                                      >   static class
                                      InMemoryImageHandle implements
                                      ImageHandle {<br>
                                      >     private final byte[]
                                      data;<br>
                                      ><br>
                                      >     public
                                      InMemoryImageHandle(byte[] data) {<br>
                                      >       this.data = data;<br>
                                      >     }<br>
                                      ><br>
                                      >     @Override<br>
                                      >     public byte[]
                                      getImageData() {<br>
                                      >       return data;<br>
                                      >     }<br>
                                      ><br>
                                      >     @Override<br>
                                      >     public String getKey() {<br>
                                      >       return null;<br>
                                      >     }<br>
                                      ><br>
                                      >     @Override<br>
                                      >     public boolean
                                      isFastSource() {<br>
                                      >       return true;<br>
                                      >     }<br>
                                      >   }<br>
                                      ><br>
                                      >   record Txt2Img(String
                                      prompt, int steps) {}<br>
                                      >   record
                                      Txt2ImgResponse(List<String>
                                      images) {}<br>
                                      > }<br>
                                      ><br>
                                      ><br>
                                      ></span><o:p></o:p></p>
                                </div>
                              </div>
                            </div>
                          </blockquote>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                <p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
              </div>
            </div>
          </div>
        </div>
      </blockquote>
      <br>
    </blockquote>
  </body>
</html>