Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8306923

ScrollTo does not work if the view is already displayed

XMLWordPrintable

    • x86_64
    • windows_10

      ADDITIONAL SYSTEM INFORMATION :
      OS - Windows 10 22H2 64 bits
      JavaFX - 17.0.7


      A DESCRIPTION OF THE PROBLEM :
      The "scrollTo" feature on ListView is no longer working on JavaFX 17 and after
      I works on Java 8, java 15.0.2 but not java 15.0.3 and after
      When I have a view already displayed, if I try to perform a ScrollTo with a list of items having a variable size (some items have only one line, others have several lines), the ScrollTo does not work the first time (the cursor remains stuck in the middle of the ScrollBar).

      REGRESSION : Last worked in version 8

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Create a listview in JavaFX.
      Display it in a scene with .show().
      Then insert 10 or 20 items of variable size in the list (items on a single line, items on several lines...)
      Then call the command listView.scrollTo(19); //Scroll to 19th index i.e. 20th element
      Launch the program and you'd notice the list didn't scroll to the selected element (scrollTo doesn't work)

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      List View should scroll down to the given index/element in listView.scrollTo() method call.
      ACTUAL -
      The ScrollTo points to the correct listview item but the focus is still stuck in the middle of the listView

      ---------- BEGIN SOURCE ----------

      import javafx.application.Application;
      import javafx.application.Platform;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.control.ListView;
      import javafx.scene.layout.HBox;
      import javafx.stage.Stage;

      public class Test3 extends Application {

          @Override
          public void start(Stage primaryStage) throws Exception {
              ListView listView = new ListView();
              Button button = new Button("ScrollTo");

              HBox hbox = new HBox(listView, button);
              Scene scene = new Scene(hbox, 800, 600);
              primaryStage.setScene(scene);
              primaryStage.show();

              button.setOnAction(e -> {
                  listView.getItems().clear();
                  listView.getItems().add("Item 1");
                  listView.getItems().add("Item 1\nItem 2");
                  listView.getItems().add("Item 1\nItem 2\nItem 3");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7\nItem8");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4");
                  listView.getItems().add("Item 1\nItem 2\nItem 3");
                  listView.getItems().add("Item 1\nItem 2");
                  listView.getItems().add("Item 1");
                  listView.getItems().add("Item 1\nItem 2");
                  listView.getItems().add("Item 1\nItem 2\nItem 3");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7\nItem8");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6\nItem7");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5\nItem6");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4\nItem5");
                  listView.getItems().add("Item 1\nItem 2\nItem 3\nItem4");
                  listView.getItems().add("Item 1\nItem 2\nItem 3");
                  listView.getItems().add("Item 1\nItem 2");

                  Platform.runLater(() -> {
                  listView.getSelectionModel().select(27);
                  listView.scrollTo(27);
                  });
              });
          }

          public static void main(String[] args) {
              Application.launch(args);
          }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      JDK-8089589 may look like it works and it is duplicate, but it doesn't!
      JDK-8089589 uses items that are all the same size!

      FREQUENCY : always


            mindraganti Muralidhar Indraganti
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: