Доступ к произвольным узлам из цели EventHandler - PullRequest
0 голосов
/ 28 июня 2019

Я работаю над небольшим приложением 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()

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Если вы не сохраните поле другим способом, нет.Вы можете прикрепить несколько 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);
    ...
}

Лучше, насколько это возможно, отделить модификацию определенных значений от макета сценыв любом случае, поскольку это облегчает вам перестановку сцены, не беспокоясь о том, что обработчики событий перемещаются по сцене правильно с помощью навигации вверх / вниз по сцене.Кроме того, у вас будут проблемы, если вы используете свой подход в тех случаях, когда вы используете «родителя», отличного от Pane или Group, например, ScrollPane, поскольку обложка ScrollPane вставляет content узел в сцене как его потомок, но не как дочерний, и он не делает этого до первого прохода макета.


Кстати: обратите внимание, что Event.getSource возвращает узел, для которого сработал обработчик событий, а не Event.getTarget.

0 голосов
/ 28 июня 2019

Чтобы получить конкретный узел, вы можете использовать метод lookup () класса javafx.scene.Scene.

Например, вы можете установить идентификатор для узла, содержащего некоторый текст, а затем найти его с помощью 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 */
};

Идентификатор, который вы можете установить:

  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 ().

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...