JavaFX:父级及其子级的鼠标单击事件

标签 java javafx

我有一张卡片,由页眉、正文和页脚组成,可以包含更多节点,如标签、文本字段等。

当点击在卡片内部发生时,我需要随时捕获鼠标点击事件,无论它是卡片本身还是它的子卡片之一。目前,如果我单击文本字段,则不会触发事件。

private StackPane newCard() {
        //card wrapper
        StackPane card = new StackPane();
        VBox cardContent = new VBox();

        JFXDepthManager.setDepth(card, 1);
        //Header
        StackPane header = new StackPane();

        VBox headerContent = new VBox();
        header.getChildren().add(headerContent);
        Label label = new Label("Card title");

        //if I click this text field, event is not triggered
        TextField groupCode = new TextField();

        headerContent.getChildren().addAll(label, groupCode);

        //body
        StackPane body = new StackPane();


        //footer
        StackPane footer = new StackPane();


        cardContent.getChildren().addAll(header, body, footer);
        card.getChildren().add(cardContent);

        //event
        card.setOnMouseClicked(event -> System.out.println("Clicked!"));

        return card;
    }

就像上面的示例一样,如果我单击文本字段来输入内容,则不会打印 "Clicked!"

最佳答案

你可以这样做

card.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> System.out.println("Clicked!"));

描述了 JavaFX 中事件处理的完整机制 here 。简而言之,事件有一个目标,在本例中是与鼠标单击相交的最顶层节点。 (直观上,它是用户在视觉上单击的节点。)因此,如果您单击文本字段,则目标就是文本字段。事件分派(dispatch)有两个阶段:捕获冒泡。在捕获阶段,事件首先传递到根节点,然后传递到作为目标祖先的根的子节点,依此类推,直到到达目标。在捕获阶段,任何向适当节点注册的事件过滤器都将被调用。事件捕获完成后,冒泡阶段开始。在冒泡阶段,事件首先传递到目标节点,然后传递到其父节点,依此类推,直到再次到达根节点。在冒泡阶段,将调用向节点注册的事件处理程序

在事件处理的任何阶段,过滤器或处理程序都可以 consume事件。这基本上可以防止事件的进一步传播。一些控件具有消耗某些事件的内置处理程序;您的示例中的文本字段就是其中之一。因此,文本字段上的鼠标单击不会传播到父节点中的处理程序。注册事件过滤器而不是处理程序允许事件由您的处理程序处理。

关于JavaFX:父级及其子级的鼠标单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47392346/

相关文章:

java - 不使用 JavaFX 时使用 FXCollections 是否干净/正确

java - 如何从 Spring Controller 创建文件保存对话框?

java - 需要帮助计算 arrayList 中的字符

java - 如何使用 ant 转储 MySQL 数据库?

java - Gradle 无法使用 useJUnitPlatform() 运行 JUnit 测试

JavaFX TextArea如何使用自动换行符设置文本

JavaFX 阶段*有时*在 Win10 上显示为空白

java - 如何让 javafx 14 编译并运行?

java - 在给定的字符串数组中搜索单词

java - 规范没有根元素的原始 xml 数据