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

Pressing ESCAPE in an editing cell in TableView caused the TableView losing focus

    XMLWordPrintable

Details

    Description

      You can reproduce this issue in any TableView as long as you have a focusable control before the TableView. Start the cell editing, press ESCAPE. The ESCAPE should only cancel the cell editing and return the focus back to the TableView. However the focus was set to the first first focusable control in that scene.

      See below for a test case that was modified from the TableView tutorial on JavaFX website.

      package demo.table;

      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.*;
      import javafx.scene.control.TableColumn.CellEditEvent;
      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 TableFocusSample 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(600);
              stage.setHeight(550);

              final Label label = new Label("Address Book");

              table.setEditable(true);

              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(hb, label, table);

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

        Activity

          People

            jgiles Jonathan Giles
            dqiaojfx David Qiao (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:
              Imported: