从EventHandler目标访问任意节点



我正在处理一个小型Javafx应用程序。在此应用程序中,我有以下组件:

BorderPane -> as the root element
        HBox top, bottom -> top and bottom regions
        VBox left, right -> left and right regions
        FlowPane center -> central region

单击中央区域时,我需要访问包含一些文本的顶部区域中的节点。为了访问它,我像这样从事件的目标上爬上图:

public EventHandler<MouseEvent> fieldClicked = (MouseEvent e) -> {
    FlowPane target = (FlowPane)e.getTarget();
    BorderPane root = (BorderPane)target.getParent();
    HBox top = (HBox)root.getChildren().get(0);
    HBox top_left = (HBox)top.getChildren().get(0);
    Text total = (Text)top_left.getChildren().get(0);
    ObservableList<Node> dices = target.getChildren();
    /* Do some stuff with retrieved nodes */
};

是否有更好且更少的详细方法访问场景中的任意节点,迭代拨打Node.getParent()

如果您不以其他方式存储字段,则不。您可以连接一些id,以通过CSS选择器(lookup(找到节点,但是在这种情况下,您会以不同的方式进行此操作:

存储您需要在字段中访问的节点(如果您在创建节点的同一范围内注册事件处理程序,则有效地在本地变量中访问(。

...
private BorderPane root;
private HBox top;
private Text total;
private FlowPane target;
public EventHandler<MouseEvent> fieldClicked = (MouseEvent e) -> {
    ObservableList<Node> dices = target.getChildren();
    /* Do some stuff with fields */
};
private void initializeNodes() {
    ...
    total = new Text();
    top = new HBox(total);
    root.setTop(top);
    target = new FlowPane();
    root.setCenter(target);
    ...
}

最好从场景的布局中解脱某些值的修改,无论如何,这使您更容易重新重新安排场景,而不必担心事件处理人员通过UP///////虽然是场景的下降导航。此外,如果您在使用PaneGroup以外的"父"的情况下使用您的方法,例如ScrollPane由于ScrollPane的皮肤将content节点插入场景中,因为它是后代,但不是因为它的孩子,并且直到第一个布局通过。


btw:请注意,触发事件处理程序的节点是Event.getSource,而不是Event.getTarget

要获得一个特定的节点,您可以使用Javafx.scene.scene类的Lookup((方法。

例如,您可以在包含一些文本的节点上设置一个ID,然后使用scene.lookup("#theid"(找到它。

   public EventHandler<MouseEvent> fieldClicked = (MouseEvent e) -> {
    FlowPane target = (FlowPane)e.getTarget();
    Text total = (Text) target.getScene().lookup("#myTextID");
/* Do some stuff with retrieved nodes */
};

您可以设置的ID:

  Text text = new Text("My Text element somewhere");
  text.setId("myTextID");

我是Javafx的新手,所以我不知道这是否是最好的方法。但是我希望这就是您想要的。

顺便说一句,如果您想进入根节点,则可以使用:

   public EventHandler<MouseEvent> fieldClicked = (MouseEvent e) -> {
    FlowPane target = (FlowPane)e.getTarget();
    BorderPane root = (BorderPane) target.getScene().getRoot();
};

当您在Flowpane中有更多元素时,它可能会有所帮助,那么您也不必将其调用node.getParent((。

希望它有帮助!

相关内容

  • 没有找到相关文章

最新更新