Detecta doble clic en la fila de TableView JavaFX

Necesito detectar clics dobles en una fila de TableView .

¿Cómo puedo escuchar los clics dobles en cualquier parte de la fila y obtener todos los datos de esta fila para imprimirla en la consola?

 TableView table = new TableView<>(); //... table.setRowFactory( tv -> { TableRow row = new TableRow<>(); row.setOnMouseClicked(event -> { if (event.getClickCount() == 2 && (! row.isEmpty()) ) { MyType rowData = row.getItem(); System.out.println(rowData); } }); return row ; }); 

Aquí hay un ejemplo completo de trabajo:

 import java.util.Random; import java.util.function.Function; import javafx.application.Application; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; 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.TableRow; import javafx.scene.control.TableView; import javafx.stage.Stage; public class TableViewDoubleClickOnRow extends Application { @Override public void start(Stage primaryStage) { TableView table = new TableView<>(); table.setRowFactory(tv -> { TableRow row = new TableRow<>(); row.setOnMouseClicked(event -> { if (event.getClickCount() == 2 && (! row.isEmpty()) ) { Item rowData = row.getItem(); System.out.println("Double click on: "+rowData.getName()); } }); return row ; }); table.getColumns().add(column("Item", Item::nameProperty)); table.getColumns().add(column("Value", Item::valueProperty)); Random rng = new Random(); for (int i = 1 ; i < = 50 ; i++) { table.getItems().add(new Item("Item "+i, rng.nextInt(1000))); } Scene scene = new Scene(table); primaryStage.setScene(scene); primaryStage.show(); } private static  TableColumn column(String title, Function> property) { TableColumn col = new TableColumn<>(title); col.setCellValueFactory(cellData -> property.apply(cellData.getValue())); return col ; } public static class Item { private final StringProperty name = new SimpleStringProperty(); private final IntegerProperty value = new SimpleIntegerProperty(); public Item(String name, int value) { setName(name); setValue(value); } public StringProperty nameProperty() { return name ; } public final String getName() { return nameProperty().get(); } public final void setName(String name) { nameProperty().set(name); } public IntegerProperty valueProperty() { return value ; } public final int getValue() { return valueProperty().get(); } public final void setValue(int value) { valueProperty().set(value); } } public static void main(String[] args) { launch(args); } } 

Ejemplo:

 table.setOnMousePressed(new EventHandler() { @Override public void handle(MouseEvent event) { if (event.isPrimaryButtonDown() && event.getClickCount() == 2) { System.out.println(table.getSelectionModel().getSelectedItem()); } } }); 

Si está utilizando un modelo de selección personalizado, puede obtener la fila del evento, por ejemplo:

 table.setOnMousePressed(new EventHandler() { @Override public void handle(MouseEvent event) { if (event.isPrimaryButtonDown() && event.getClickCount() == 2) { Node node = ((Node) event.getTarget()).getParent(); TableRow row; if (node instanceof TableRow) { row = (TableRow) node; } else { // clicking on text part row = (TableRow) node.getParent(); } System.out.println(row.getItem()); } } }); 

Si está utilizando SceneBuilder , puede configurar el método OnMouseClicked su tabla para handleRowSelect() método handleRowSelect() como se muestra a continuación:

 MyType temp; Date lastClickTime; @FXML private void handleRowSelect() { MyType row = myTableView.getSelectionModel().getSelectedItem(); if (row == null) return; if(row != temp){ temp = row; lastClickTime = new Date(); } else if(row == temp) { Date now = new Date(); long diff = now.getTime() - lastClickTime.getTime(); if (diff < 300){ //another click registered in 300 millis System.out.println("Edit dialog"); } else { lastClickTime = new Date(); } } } 

Esto funciona para mí:

 table.setOnMouseClicked((MouseEvent event) -> { if (event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2){ System.out.println(table.getSelectionModel().getSelectedItem()); } }); } 

Esta respuesta ha sido probada:

 table.setOnMouseClicked( event -> { if( event.getClickCount() == 2 ) { System.out.println( table.getSelectionModel().getSelectedItem()); }}); 

table.getSelectionModel().getSelectedItem() se puede usar ya que tomamos un doble clic. El primer clic en la selección se mueve, en el segundo se ejecuta este controlador.