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

Button's events are not working in a ListView

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 8u20
    • 8
    • javafx
    • OS X 10.9, JDK 8 RC 64bit

      When a Button is placed in a ListCell (or probably any other Cell) its onAction event is never fired and onMouseClicked very rarely and seemingly randomly. Found on JDK8 RC. Here is some example code:

      import javafx.application.Application;
      import javafx.collections.FXCollections;
      import javafx.collections.ObservableList;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.control.ListCell;
      import javafx.scene.control.ListView;
      import javafx.stage.Stage;

      public class Testing extends Application {

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

          @Override
          public void start(Stage primaryStage) throws Exception {
              ObservableList<String> strings = FXCollections.observableArrayList();
              strings.addAll("text", "another");
              ListView<String> list = new ListView<>(strings);
              list.setCellFactory(cell -> new ButtonCell());
              Scene s = new Scene(list, 300, 400);
              primaryStage.setScene(s);
              primaryStage.show();
          }

          private class ButtonCell extends ListCell<String> {

              @Override
              protected void updateItem(String item, boolean empty) {
                  super.updateItem(item, empty);
                  if (empty) {
                      setText(null);
                      setGraphic(null);
                  } else {
                      setText(item);
                      Button b = new Button("button");
                      b.setOnAction(action -> System.out.println("zam"));
                      b.setOnMouseClicked(action -> System.out.println("bam"));
                      setGraphic(b);
                  }
              }
          }
      }

      WORKAROUND... return from updateItem if the cell's index has not changed.

          private class ButtonCell extends ListCell<String> {

              int currentIndex = -1;
              @Override
              protected void updateItem(String item, boolean empty) {
                  super.updateItem(item, empty);
                  if (empty) {
                      setText(null);
                      setGraphic(null);
                  } else {
                      int index = getIndex();
                      if (currentIndex == index) return;
                      currentIndex = index;
                      setText(item);
                      Button b = new Button("button");
                      b.setOnAction(action -> System.out.println("zam"));
                      b.setOnMouseClicked(action -> System.out.println("bam"));
                      setGraphic(b);
                  }
              }

          }

            dgrieve David Grieve
            duke J. Duke
            Votes:
            1 Vote for this issue
            Watchers:
            9 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: