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

[TableView] TableView selection problem with SHIFT

    XMLWordPrintable

    Details

    • Subcomponent:
    • Verification:
      Not verified

      Description

      We have an issue related to RT-38306 :

      Run this sample below (which is just the official TableViewSample with multiple cell selection enabled).

      -> select a cell in the middle
      -> then hold SHIFT and select the top-left cell of the table

      The cells should be selected but nothing happens! Actually it's impossible to make a selection with SHIFT that is going up!

      This is serious regression from 8u20. I've targeted the introduction of this bug to JDK8u40 b09 I think..

      import javafx.application.Application;
      import javafx.beans.property.SimpleStringProperty;
      import javafx.collections.FXCollections;
      import javafx.collections.ObservableList;
      import javafx.event.ActionEvent;
      import javafx.event.EventHandler;
      import javafx.geometry.Insets;
      import javafx.scene.Group;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.control.Label;
      import javafx.scene.control.SelectionMode;
      import javafx.scene.control.TableColumn;
      import javafx.scene.control.TableColumn.CellEditEvent;
      import javafx.scene.control.TableView;
      import javafx.scene.control.TextField;
      import javafx.scene.control.cell.PropertyValueFactory;
      import javafx.scene.control.cell.TextFieldTableCell;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.VBox;
      import javafx.scene.text.Font;
      import javafx.stage.Stage;
       
      public class TableViewSample extends Application {
       
          private TableView<Person> table = new TableView<Person>();
          private final ObservableList<Person> data =
                  FXCollections.observableArrayList(
                  new Person("Jacob", "Smith", "jacob.smith@example.com"),
                  new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                  new Person("Ethan", "Williams", "ethan.williams@example.com"),
                  new Person("Emma", "Jones", "emma.jones@example.com"),
                  new Person("Michael", "Brown", "michael.brown@example.com"));
          final HBox hb = new HBox();
       
          public static void main(String[] args) {
              launch(args);
          }
       
          @Override
          public void start(Stage stage) {
              Scene scene = new Scene(new Group());
              stage.setTitle("Table View Sample");
              stage.setWidth(450);
              stage.setHeight(550);
       
              final Label label = new Label("Address Book");
              label.setFont(new Font("Arial", 20));
       
              table.setEditable(true);
              table.getSelectionModel().setCellSelectionEnabled(true);
              table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
       
              TableColumn firstNameCol = new TableColumn("First Name");
              firstNameCol.setMinWidth(100);
              firstNameCol.setCellValueFactory(
                  new PropertyValueFactory<Person, String>("firstName"));
              firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
              firstNameCol.setOnEditCommit(
                  new EventHandler<CellEditEvent<Person, String>>() {
                      @Override
                      public void handle(CellEditEvent<Person, String> t) {
                          ((Person) t.getTableView().getItems().get(
                                  t.getTablePosition().getRow())
                                  ).setFirstName(t.getNewValue());
                      }
                  }
              );
       
       
              TableColumn lastNameCol = new TableColumn("Last Name");
              lastNameCol.setMinWidth(100);
              lastNameCol.setCellValueFactory(
                  new PropertyValueFactory<Person, String>("lastName"));
              lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
              lastNameCol.setOnEditCommit(
                  new EventHandler<CellEditEvent<Person, String>>() {
                      @Override
                      public void handle(CellEditEvent<Person, String> t) {
                          ((Person) t.getTableView().getItems().get(
                              t.getTablePosition().getRow())
                              ).setLastName(t.getNewValue());
                      }
                  }
              );
       
              TableColumn emailCol = new TableColumn("Email");
              emailCol.setMinWidth(200);
              emailCol.setCellValueFactory(
                  new PropertyValueFactory<Person, String>("email"));
              emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
              emailCol.setOnEditCommit(
                  new EventHandler<CellEditEvent<Person, String>>() {
                      @Override
                      public void handle(CellEditEvent<Person, String> t) {
                          ((Person) t.getTableView().getItems().get(
                              t.getTablePosition().getRow())
                              ).setEmail(t.getNewValue());
                      }
                  }
              );
       
              table.setItems(data);
              table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
       
              final TextField addFirstName = new TextField();
              addFirstName.setPromptText("First Name");
              addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
              final TextField addLastName = new TextField();
              addLastName.setMaxWidth(lastNameCol.getPrefWidth());
              addLastName.setPromptText("Last Name");
              final TextField addEmail = new TextField();
              addEmail.setMaxWidth(emailCol.getPrefWidth());
              addEmail.setPromptText("Email");
       
              final Button addButton = new Button("Add");
              addButton.setOnAction(new EventHandler<ActionEvent>() {
                  @Override
                  public void handle(ActionEvent e) {
                      data.add(new Person(
                              addFirstName.getText(),
                              addLastName.getText(),
                              addEmail.getText()));
                      addFirstName.clear();
                      addLastName.clear();
                      addEmail.clear();
                  }
              });
       
              hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
              hb.setSpacing(3);
       
              final VBox vbox = new VBox();
              vbox.setSpacing(5);
              vbox.setPadding(new Insets(10, 0, 0, 10));
              vbox.getChildren().addAll(label, table, hb);
       
              ((Group) scene.getRoot()).getChildren().addAll(vbox);
       
              stage.setScene(scene);
              stage.show();
          }
       
          public static class Person {
       
              private final SimpleStringProperty firstName;
              private final SimpleStringProperty lastName;
              private final SimpleStringProperty email;
       
              private Person(String fName, String lName, String email) {
                  this.firstName = new SimpleStringProperty(fName);
                  this.lastName = new SimpleStringProperty(lName);
                  this.email = new SimpleStringProperty(email);
              }
       
              public String getFirstName() {
                  return firstName.get();
              }
       
              public void setFirstName(String fName) {
                  firstName.set(fName);
              }
       
              public String getLastName() {
                  return lastName.get();
              }
       
              public void setLastName(String fName) {
                  lastName.set(fName);
              }
       
              public String getEmail() {
                  return email.get();
              }
       
              public void setEmail(String fName) {
                  email.set(fName);
              }
          }
      }

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              jgiles Jonathan Giles
              Reporter:
              shadzic Samir Hadzic
              Votes:
              1 Vote for this issue
              Watchers:
              6 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Imported: