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

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

缑泓
2023-03-14

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

我需要抓住鼠标点击事件的任何时间,当点击发生在卡内,无论它是卡本身还是其子卡之一。现在,如果我单击文本字段,事件不会被触发。

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;
    }

就像上面的例子一样,如果我单击文本字段来键入某些内容,单击!未打印。

共有1个答案

鲁博雅
2023-03-14

你可以用

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

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

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

 类似资料:
  • 问题内容: 我有一张卡,它由页眉,正文和页脚组成,可以由更多节点组成,例如标签,文本字段等。 当 卡内 发生单击时,无论何时是卡本身还是它的子代之一,我都需要捕捉事件。现在,如果我单击文本字段,则不会触发事件。 因此,就像上面的示例一样,如果我单击文本字段键入内容,则不会打印。 问题答案: 你可以用 这里描述了JavaFX中事件处理的完整机制。简而言之,事件具有 target ,在这种情况下, t

  • 我有一个人员搜索脚本,在您键入时显示建议。结果的结构大致如下: 由于人员列表会随着您的键入而改变,到目前为止,我使用jQuery的live()函数自动将click事件绑定到所有的.person元素。这是不推荐的和糟糕的做法,所以我正在尝试更新代码。 我觉得我需要这样的东西: 但是我想更多地了解一下如何在vanilla JavaScript中处理这个问题。我以为当点击带有click事件的项的子项时,

  • 如何选择以下条件: 选择不带子项的所有父项 选择所有父级和子级 选择带有雄性子项的所有父项(因此,当通过groovy类型转换转换为JSON时,只应包括雄性子项) 我不知道如何开始编码1和2,也许与有关--我真的不知道。虽然我在第3章的想法是: 但问题是,当转换为JSON时,它包含了非男性条目。有谁能帮我解决问题吗?使用会很好,但也可以在中使用。

  • 我试图想出一个解决方案,允许多个窗格节点在组装成StackPane时独立处理鼠标事件 我希望能够在每个子级中处理鼠标事件,并且第一个调用消费()的子级会停止将事件传递给下一个子级。 我也知道setPickOnBands(false),但这并不能解决所有情况,因为一些覆盖将基于Canvas的像素,即不涉及场景图。 我用尝试了各种实验。然而,这些总是导致递归以堆栈溢出告终。这是因为事件是从根场景传播的

  • 在显示imageView的可调整大小的窗格中,我想选择多个矩形。 为此,我创建了一个类SelecTableImageViewPane。ImageViewPane和RubberBandSelection这两个类来自com.bitplan.javaFX项目,我是该项目的提交人。 当调整窗口的大小时,相关窗格的大小也会调整得很好,您可以从SelectableImageViewPaneDemo产生的调试输

  • 问题内容: 在下面的函数中,我获得带有属性的textarea对象。 此处,嵌套解构使用和变量。但是变量不起作用。 问题答案: 第一个解构仅创建和变量。如果要创建为变量,则需要再次声明。 您可以在Babel编译器上对其进行测试: 这段代码: 被转移到: 如您所见,未创建变量。