我有一张卡片,由页眉、正文和页脚组成,可以包含更多节点,如标签、文本字段等。
我需要抓住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中事件处理的完整机制here。但简而言之,一个事件有一个target,在本例中是与鼠标单击相交的最顶层节点。 (直观上,它是用户在视觉上单击的节点。)因此,如果您单击文本字段,则目标就是文本字段。事件派发有两个阶段:捕获 and bubbling。在捕获阶段,事件首先传递到根节点,然后传递到作为目标祖先的根的子节点,依此类推,直到到达目标。在捕获阶段,任何事件filters注册到适当的节点将被调用。事件捕获完成后,冒泡阶段开始。在冒泡阶段,事件首先传递到目标节点,然后传递到其父节点,依此类推,直到再次到达根节点。在冒泡阶段,事件handlers调用在节点注册的。
在事件处理的任何阶段,过滤器或处理程序都可以consume事件。这基本上可以防止事件的进一步传播。一些控件具有消耗某些事件的内置处理程序;您的示例中的文本字段就是其中之一。因此,文本字段上的鼠标单击不会传播到父节点中的处理程序。注册事件过滤器而不是处理程序允许事件由您的处理程序处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)