当前位置: 首页 > 知识库问答 >
问题:

检测双击 TableView JavaFX 的行

富念
2023-03-14

我需要检测对表格视图行的双击。

如何监听该行任何部分的双击并获取该行的所有数据以将其打印到控制台?

共有3个答案

吕俊才
2023-03-14

这适用于我:

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

例子:

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

如果使用自定义选择模型,则可以从事件中获取行,例如:

table.setOnMousePressed(new EventHandler<MouseEvent>() {
    @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());
        }
    }
});
何嘉运
2023-03-14
TableView<MyType> table = new TableView<>();

//...

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

这是一个完整的工作示例

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<Item> table = new TableView<>();
        table.setRowFactory(tv -> {
            TableRow<Item> 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 <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue<T>> property) {
        TableColumn<S,T> 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);
    }
}
 类似资料:
  • 问题内容: 我需要检测到的一行上双击。 如何侦听该行任何部分的双击并获取该行的所有数据以将其打印到控制台? 问题答案: 这是一个完整的工作示例:

  • 注:此具体问题已解决,但存在严重的后续问题。查看GestureDetector-在GridView项目中双击Detect,但在onTouchEvent()中返回false 我想检测图像的< code>GridView中不同项目的双击。因此,我为适配器的< code>getView()方法中的每个项目< code>imageView分配了一个单独的< code>OnTouchListener。< c

  • 本文向大家介绍Unity实现鼠标双击与长按的检测,包括了Unity实现鼠标双击与长按的检测的使用技巧和注意事项,需要的朋友参考一下 在unity中,我们会遇到很多的关于鼠标的事件。虽然unity中给出了相关的点击与拖拽方法,可是这些方法只对UI和碰撞体适用。那么,如何直接用代码实现鼠标的双击与长按的检测呢? 首先我们需要几个变量,用来保存时间,以判断是长按还是点击。 先来说说这些变量的用处。mai

  • 我有:我在水平滚动视图中有一组按钮 我想要的:我想要在双击按钮时检测事件 注意通常我处理点击事件使用.但是现在我怎么能实现同样的双击。如果有任何界面我也可以用于此目的,这将是有帮助的

  • 问题内容: 我知道我可以检查是否有鼠标左键 但是如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮? 问题答案: 我从未使用过-但是: 检测双击: 猜测一下,而不是立即处理每次单击,而是施加50ms的延迟,然后查看您在该时间是否收到另一个单击事件。用户可能不会注意到50ms的延迟。 区分上/下滚轮: 请参阅此文档页面上的注释。显然,定义了五个按钮-左,中,右,上滚轮和下滚轮。

  • 我正在使用Java SDK在HarmonyOS中创建一个自定义组件,在那里我必须双击一些任务。但我无法检测到双击事件。 在Android中,借助GestureDetector类,我们可以检测双击事件,如下所示: 在HMOS中,我尝试使用Component.TouchEventListener检测双击,如下所示: 但是,它没有检测到双击。在双击也有打印单点击检测。