【问题标题】:JavaFX: On Mouse Clicked event for parent and its childrenJavaFX:父及其子的鼠标单击事件
【发布时间】:2017-11-20 21:32:18
【问题描述】:

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

而且我需要在点击发生卡内时随时捕捉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!" 不会打印出来。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    你可以这样做

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多