因此,我使用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);
如果有明显更好的方法,我很想知道。 在挥杆编程中,我将通过针对SwingUtilities.isDescendingFrom(按住搜索栏组件的父级,即单击目标)检查鼠标按下的目标来解决此问题。这会让我知道点击是否在搜索栏的任何组件上。
我试图明确列出搜索栏中的所有组件,但是搜索栏包含一个TextField,用于在字段上注册新闻目标,文本本身,一个随机Pane对象以及更多嵌套的节点,我猜呢?
JavaFX中是否有类似的命令,或者在JavaFX中甚至有更好的方法?谢谢
答案 0 :(得分:0)
我最终进行了广泛的搜索,以检查点击的目标部分是否是我的顶级节点的后代。 code and explanation in this answer
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;
}
然后,当点击进入时,如果目标不是搜索栏的顶级节点的后代,则该栏将关闭。