繁体   English   中英

JavaFX:父项及其子项的“鼠标单击”事件

[英]JavaFX: On Mouse Clicked event for parent and its children

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

卡内发生单击时,无论何时是卡本身还是它的子代之一,我都需要随时捕捉on mouse clicked事件。 现在,如果我单击文本字段,则不会触发事件。

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中事件处理的完整机制。 简而言之,事件具有target ,在这种情况下, target是与鼠标单击相交的最顶层节点。 (直观上,它是用户在视觉上单击的节点。)因此,如果您在文本字段中单击,则目标是文本字段。 事件分配有两个阶段: 捕获起泡 在捕获阶段,事件首先传递到根节点,然后传递到作为目标祖先的根的子节点,依此类推,直到到达目标为止。 在捕获阶段,将调用在相应节点注册的所有事件过滤器 一旦事件捕获完成,冒泡阶段就开始了。 在冒泡阶段,事件首先传递到目标节点,然后传递给其父节点,依此类推,直到事件再次到达根节点为止。 在冒泡阶段,将调用在节点注册的事件处理程序

在事件处理的任何阶段,过滤器或处理程序都可以使用事件。 这从本质上防止了事件的进一步传播。 一些控件具有内置的处理程序,这些处理程序使用某些事件。 您的示例中的文本字段是一个。 因此,在文本字段上的鼠标单击不会传播到父节点中的处理程序。 注册事件过滤器而不是处理程序,将允许您的处理程序处理事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM