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

[TableView] selectedItemProperty gets no changed event, if different cells in the same row are selected

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • 8u60
    • 8u40
    • javafx
    • Windows 7, Java(TM) SE Runtime Environment 1.8.0_40-b25

      Change selected cell in a tableview only get changed events in selectedItemProperty, if the selected cell is in another row. Change selected cell within the same row does not cause a changed event.

      The code within the javafx SelectionModel want to set setSelectedIndex:68 and the IntegerProperty checks, if the values are different to call markInvalid, but changes within the same row skip this part.

      Sample code shows following behaviour:
      Selected cell within the same row, does not produce System.out calls.
      Selected cell from different row, does produce System.out calls.

      Here is my sample code:

      import javafx.application.Application;
      import javafx.beans.property.SimpleStringProperty;
      import javafx.collections.FXCollections;
      import javafx.collections.ObservableList;
      import javafx.geometry.Insets;
      import javafx.scene.Group;
      import javafx.scene.Scene;
      import javafx.scene.control.Label;
      import javafx.scene.control.SelectionMode;
      import javafx.scene.control.TableColumn;
      import javafx.scene.control.TablePosition;
      import javafx.scene.control.TableView;
      import javafx.scene.control.cell.PropertyValueFactory;
      import javafx.scene.layout.VBox;
      import javafx.scene.text.Font;
      import javafx.stage.Stage;
       
      public class TableViewTest 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")
              );
         
          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(500);
       
              final Label label = new Label("Address Book");
              label.setFont(new Font("Arial", 20));
       
              table.setEditable(true);
       
              TableColumn firstNameCol = new TableColumn("First Name");
              firstNameCol.setMinWidth(100);
              firstNameCol.setCellValueFactory(
                      new PropertyValueFactory<Person, String>("firstName"));
       
              TableColumn lastNameCol = new TableColumn("Last Name");
              lastNameCol.setMinWidth(100);
              lastNameCol.setCellValueFactory(
                      new PropertyValueFactory<Person, String>("lastName"));
       
              TableColumn emailCol = new TableColumn("Email");
              emailCol.setMinWidth(200);
              emailCol.setCellValueFactory(
                      new PropertyValueFactory<Person, String>("email"));
       
              table.setItems(data);
              table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
       
              table.getSelectionModel().setCellSelectionEnabled(true);
              table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
              addTableSelectionListener(table);
              
              final VBox vbox = new VBox();
              vbox.setSpacing(5);
              vbox.setPadding(new Insets(10, 0, 0, 10));
              vbox.getChildren().addAll(label, table);
       
              ((Group) scene.getRoot()).getChildren().addAll(vbox);
       
              stage.setScene(scene);
              stage.show();
          }
       
          private void addTableSelectionListener(final TableView<Person> tableView) {

              tableView.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
                  //Check whether item is selected and set value of selected item to Label
                  if (tableView.getSelectionModel().getSelectedItem() != null) {
                      TableView.TableViewSelectionModel selectionModel = tableView.getSelectionModel();
                      ObservableList selectedCells = selectionModel.getSelectedCells();
                      TablePosition tablePosition = (TablePosition) selectedCells.get(0);
                      // sets selected value into StringProperty
                      System.out.println(" " + (String) tablePosition.getTableColumn().getCellData(newValue));
                  }
                  
              });
          }
          
          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);
              }
          }
      }

            jgiles Jonathan Giles
            duke J. Duke
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: