我正在处理一个小型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///////虽然是场景的下降导航。此外,如果您在使用Pane
或Group
以外的"父"的情况下使用您的方法,例如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((。
希望它有帮助!