当前位置: 首页 > 面试题库 >

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

浦泳
2023-03-14
问题内容

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

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

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



 类似资料:
  • 我有一张卡片,它由页眉、正文和页脚组成,可以由更多节点组成,如标签、文本字段等。 我需要抓住鼠标点击事件的任何时间,当点击发生在卡内,无论它是卡本身还是其子卡之一。现在,如果我单击文本字段,事件不会被触发。 就像上面的例子一样,如果我单击文本字段来键入某些内容,未打印。

  • 我有一个带有复杂场景的javafx8应用程序。它由一个拆分窗格组成,在顶部部分,我有一个具有多个级别(子级)的堆栈窗格。最后面的是一个背景,在调整大小时只需要重新绘制,另一个是网格线,lat/long。另一个用于绘图,最后一个用于滑动复合控件。当复合材料(按钮、标签、组合框和文本字段,在stackframe的最后一个子项中,它正确地截取并处理鼠标和键盘事件。但是,当它位于顶部时,没有任何事件传播到

  • 我正在Silverlight中构建应用程序,现在我遇到了事件问题。在应用程序中,我必须绘制多边形,其中每个多边形 其中鼠标左键事件应该是在点击位置添加图像,鼠标右键事件应该是带有单个菜单项的上下文菜单。在菜单项上点击应该会显示一些简短的信息。 这是我有问题的地方。当我点击上下文菜单中的某个项目时,如果该菜单项仍然在多边形代码上,还可以检测鼠标左键事件并添加图像。 我想不添加图像时,菜单项被点击,只

  • 问题内容: 在我的三个按钮上,鼠标=中键单击和=右键单击。 两键鼠标就是这种情况吗? 谢谢 问题答案: 为了避免任何歧义,请使用SwingUtilities中的实用程序方法:

  • 出身背景 我正试图建立一个图像库的基础上描述这里。 我有一个,以和作为其子级,以相同的顺序添加。 ScrollPane包含ImageView中包含的图像列表,而Anchorpane有两个按钮,固定在左右角,用于滚动图像! 问题 滚动工作正常,因为按钮放在AnchorPane上,AnchorPane是StackPane上的顶级子级。 我想实现双击imageView以全屏方式打开它。由于imageVi

  • 我在JavaFX中制作了一个版本的风险。现在,为了显示游戏数据,我正在使用标签网格来显示有关每个区域的信息。我现在想在标签上有鼠标点击侦听器,这样我就可以通过点击它们来测试游戏功能,直到我制作了完整的游戏板。除非我尝试在FXML文档中添加侦听器,否则我会收到错误。现在,我正在控制器中声明标签,将它们添加到集合中,以便我可以使用循环绑定每个标签的文本属性,然后将每个标签添加到网格中。然后在FXML中