Saltar al contenido

Detectar doble clic en la fila de TableView JavaFX

Después de de esta prolongada compilación de datos hemos podido solucionar este enigma que pueden tener ciertos de nuestros usuarios. Te dejamos la respuesta y deseamos resultarte de mucha apoyo.

Solución:

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 de trabajo completo:

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

Esto funciona para mí:

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

Nos puedes confirmar nuestro quehacer fijando un comentario o dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *