JavaFX:父项及其子项的“鼠标单击”事件
我有一张卡,它由页眉,正文和页脚组成,可以由更多节点组成,例如标签,文本字段等。
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
是与鼠标单击相交的最顶层节点。(直观上,它是用户在视觉上单击的节点。)因此,如果单击文本字段,则目标是文本字段。事件分配有两个阶段: 捕获 和 起泡
。在捕获阶段,事件首先传递到根节点,然后传递到作为目标祖先的根的子节点,依此类推,直到事件到达目标为止。在捕获阶段,所有事件 过滤器
向相应节点注册的注册将被调用。一旦事件捕获完成,冒泡阶段就开始了。在冒泡阶段,事件首先传递到目标节点,然后传递给其父节点,依此类推,直到事件再次到达根节点为止。在冒泡阶段,将调用在节点注册的事件
处理程序 。
在事件处理的任何阶段,过滤器或处理程序都可以使用事件。这从本质上防止了事件的进一步传播。某些控件具有使用某些事件的内置处理程序。您的示例中的文本字段是一个。因此,在文本字段上的鼠标单击不会传播到父节点中的处理程序。注册事件过滤器而不是处理程序,将允许您的处理程序处理事件。
以上是 JavaFX:父项及其子项的“鼠标单击”事件 的全部内容, 来源链接: utcz.com/qa/419529.html