java - “isDescendingFrom(组件 a,组件 b)”的 JavaFX 版本
问题描述
因此,我长期使用 java Swing 进行 GUI 编程,最近正尝试转向 JavaFX。因此,问题:
我目前正在创建一个搜索栏,当用户单击搜索按钮时打开,然后在用户单击搜索栏时关闭。为了检测点击关闭,我在主场景中添加了一个 EventFilter 以监听全局点击。然后我检查点击的目标,看看点击是否在搜索栏的组件上(对不起,摆动术语)。如果点击不在搜索栏中,请关闭搜索栏。
primaryStage.getScene().addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
System.out.println(mouseEvent.getTarget());
if(!(mouseEvent.getTarget().equals(searchBarFill) || mouseEvent.getTarget().equals(searchBackground) || mouseEvent.getTarget().equals(searchBarField))){
if(searchBarOpen){
searchBarFill.radiusProperty().unbind();
searchBackground.setDisable(false);
searchBarOpen = false;
Timeline shrink = new Timeline();
Timeline fadeIn = new Timeline();
shrink.setAutoReverse(true);
KeyValue kv = new KeyValue(searchBarFill.radiusProperty(), 0, Interpolator.EASE_BOTH);
KeyFrame kf = new KeyFrame(Duration.millis(250), kv);
KeyValue kv2 = new KeyValue(searchBackground.opacityProperty(), 1.0, Interpolator.EASE_BOTH);
KeyFrame kf2 = new KeyFrame(Duration.millis(100), kv2);
shrink.getKeyFrames().add(kf);
fadeIn.getKeyFrames().add(kf2);
SequentialTransition timeline = new SequentialTransition(shrink, fadeIn);
timeline.play();
}
}
}
});
//This pane holds all search bar Nodes (components)
Pane searchBarPane = new Pane();
searchBarPane.setMaxHeight(50);
headerSearchContainer.getChildren().add(searchBarPane);
如果有明显更好的方法来做到这一点,我很想知道。在 Swing 编程中,我将通过检查鼠标按下的目标与 SwingUtilities.isDescendingFrom(持有搜索栏组件的父级,点击目标)来解决这个问题。这会让我知道点击是否在任何搜索栏组件上。
我试图明确列出搜索栏中的所有组件,但搜索栏包含一个 TextField,它注册字段上的按下目标、文本本身、一个随机窗格对象,以及我猜的更多嵌套节点?
JavaFX 中是否有类似的命令,或者在 JavaFX 中是否有更好的方法?谢谢
解决方案
我最终进行了广泛搜索,以检查单击的目标组件是否是我的顶级节点的后代。 此答案中的代码和解释
public static boolean inHierarchy(Node node, Node potentialHierarchyElement) {
if (potentialHierarchyElement == null) {
return true;
}
while (node != null) {
if (node == potentialHierarchyElement) {
return true;
}
node = node.getParent();
}
return false;
}
然后,当点击进来时,如果目标不是搜索栏顶层节点的后代,则关闭搜索栏。
推荐阅读
- android - Android 中基于 BLE 的 TLS 加密
- ios - 如何为 Apollo graphQL iOS 生成 Schema.json | 本地主机
- flask - 无需重启应用即可开发 Flask
- javascript - 如何在 rabbitmq 的 rpc 端点中增加消耗超时?
- amazon-web-services - Athena 无法查询 Glue 爬网的表
- vba - 如何在 MS-Word 或使用 VBA 中查找和替换混合格式文本
- apostrophe - 如何在 teraterm 中发送包含撇号的命令
- powerbi - DAX:从最旧的清算逾期的计算
- java - 从 repo url 中删除 Gradle 依赖 groupId
- java - 运行旧项目时出现“无法启动守护进程”