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

With Touch enabled devices scrollbar disappears and the table is scrolled to the beginning

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: openjfx11, openjfx15, openjfx17, openjfx18
    • Fix Version/s: openjfx19
    • Component/s: javafx
    • Subcomponent:
    • CPU:
      generic
    • OS:
      generic

      Description

      ADDITIONAL SYSTEM INFORMATION :
      Running on Windows 10, OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9)

      A DESCRIPTION OF THE PROBLEM :
      Using a touch-enabled device (or add the JVM argument -Dcom.sun.javafx.touch=true), the virtual flow scrolls all the way to the left when the scrollbar disappears. It allows scrolling to the right however it only stays for a second or two before the horizontal scrollbar gets reset to 0 (when the scrollbar disappears from inactivity, it gets reset to 0). From closer inspection of the code, it seems this is caused by the method updateHbar(), in .../modules/javafx.controls/src/main/java/javafx/scene/control/skin/VirtualFlow.java. The method checks if the hbar is visible and if it is not, it gets set to 0

      if (hbar.isVisible()) {
                      clipView.setClipX(hbar.getValue());
                  } else {
                      // all cells are now less than the width of the flow,
                      // so we should shift the hbar/clip such that
                      // everything is visible in the viewport.
                      clipView.setClipX(0);
                      hbar.setValue(0);
                  }



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      With the parameter (-Dcom.sun.javafx.touch=true) as a JVM argument, run an application containing a table view, where the window is smaller than the table, thus causing a horizontal scrollbar, drag the scrollbar all the way to the right and release it and wait until the scrollbar disappears.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      When the scrollbar disappears, the table should remain as it was in the position you scrolled to.
      ACTUAL -
      When the scrollbar disappears, the table is scrolled to the beginning (hbar value of 0).

      ---------- BEGIN SOURCE ----------
      import javafx.application.Application;
      import javafx.beans.property.SimpleStringProperty;
      import javafx.beans.property.StringProperty;
      import javafx.beans.value.ObservableValue;
      import javafx.scene.Scene;
      import javafx.scene.control.TableColumn;
      import javafx.scene.control.TableView;
      import javafx.scene.layout.StackPane;
      import javafx.stage.Stage;
      import javafx.util.Callback;
      import java.util.ArrayList;

      public class Main extends Application {

          int columns = 5;
          int numRows = 15;
          StackPane root = new StackPane();

          @Override
          public void start(Stage primaryStage) {
              Scene scene = new Scene(root, 200, 400);
              primaryStage.setTitle("Hello World!");
              primaryStage.setScene(scene);
              primaryStage.show();
              TableView table = getNewTestTableview();
              root.getChildren().add(table);
          }

          public TableView<StringProperty[]> getNewTestTableview() {
              TableView<StringProperty[]> tableView = new TableView<>();
              for (int i = 0; i < columns; i++) {
                  final int colIndex = i;
                  TableColumn<StringProperty[], String> col = new TableColumn<>();
                  col.setCellValueFactory(new Callback<>() {
                      @Override
                      public ObservableValue<String> call(TableColumn.CellDataFeatures<StringProperty[], String> param) {
                          return param.getValue()[colIndex];
                      }
                  });
                  tableView.getColumns().add(col);
              }

              ArrayList<StringProperty[]> rows = new ArrayList<>();

              for (int i = 0; i < numRows; i++) {
                  StringProperty[] row = new StringProperty[columns];
                  for (int j = 0; j < columns; j++) {
                      row[j] = new SimpleStringProperty("Row " + i + " Col " + j);
                  }
                  rows.add(row);
              }
              tableView.getItems().addAll(rows);
              return tableView;
          }

          /**
           * @param args the command line arguments
           */
          public static void main(String[] args) {
              launch(args);
          }

      }

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

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              aghaisas Ajit Ghaisas
              Reporter:
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: