【发布时间】:2019-06-01 03:54:24
【问题描述】:
所以我长期使用 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,它注册字段上的按下目标、文本本身、一个随机 Pane 对象以及我猜的更多嵌套节点?
在 JavaFX 中是否有类似的命令,或者在 JavaFX 中是否有更好的方法?谢谢
【问题讨论】:
-
我不明白你为什么需要
EventFilter。如果您有Button(在这种情况下ToggleButton 可能更好),您只需执行Button的onAction事件处理程序的逻辑即可。 code.makery.ch/blog/javafx-8-event-handling-examples -
我重读了你的问题。按下按钮后,您需要将
Focus设置为搜索栏。然后您需要收听以查看搜索栏何时丢失Focus。 stackoverflow.com/questions/16549296/…. -
您可以在搜索栏中为每个
Node注册一个监听器。无需检查全局鼠标事件,然后尝试使用坐标检索目标。 -
@Sedrick 所以我只需将焦点设置在包含所有搜索栏节点的窗格上,然后在它失去焦点时进行监听?搜索栏有许多不同的节点(组件),例如打开和关闭按钮、文本字段、工具提示按钮等。搜索栏中的这些附加组件中的每一个都具有鼠标侦听器等。对于使用失去焦点作为一种方法,这仍然有效吗?
-
@Zephyr 我的问题是我想检查用户何时点击离开搜索栏。因此,当用户点击搜索栏以外的任何内容时,我需要以某种方式注册