Как получить элементы на сцене JavaFX/добавлять объекты в сцену динамически

У меня есть сцена — я хочу вытащить все элементы этой сцены.

По сути, это то, что я пытаюсь создать: окно с кнопкой вверху, при нажатии на которую «порождается» новый блок на экране, который можно перетаскивать/взаимодействовать другими способами. У меня уже есть это с блоками, которые я добавляю в код. Но я хочу сделать это динамичным, и для этого мне нужно иметь возможность перебирать все объекты на моей сцене, и мне нужно знать, как динамически добавлять объекты на сцену.

Итак, чтобы было понятнее - у меня два вопроса.

Как добавить прямоугольник или круг или что-то еще в этом отношении динамически при нажатии кнопки? Как вывести список всех вещей на сцене. Если я добавлю прямоугольники, я хочу иметь возможность делать что-то вроде scene.getElements() и возвращать список элементов этой сцены, чтобы я мог перебирать их и проверять информацию о них.

Мой код:

final Circle circle = new Circle(200, 150, 50, Color.BLUEVIOLET);
final Rectangle rectangle = new Rectangle();
rectangle.setX(50);
rectangle.setY(50);
rectangle.setWidth(200);
rectangle.setHeight(100);
rectangle.setFill(Color.CORNFLOWERBLUE);
final Circle pizzaCrust = new Circle(SCENE_WIDTH/2, SCENE_HEIGHT/2, SCENE_WIDTH/2-150, Color.TAN);
final Circle pizzaInside = new Circle(SCENE_WIDTH/2, SCENE_HEIGHT/2, SCENE_WIDTH/2-160, Color.LIGHTYELLOW);
final Group group = new Group(pizzaCrust, pizzaInside, rectangle, circle);
final Scene scene = new Scene(group, SCENE_WIDTH, SCENE_HEIGHT, Color.WHITE);

person Alex K    schedule 07.10.2014    source источник


Ответы (1)


Рассмотрим метод Pane#getChildren. Вы можете зацикливаться в списке, и если вы найдете панель, вы можете снова рекурсивно вызвать метод.

Будьте осторожны, потому что элементы JavaFX не являются подклассом Pane.

Также обратите внимание, что getChildren возвращает ObservableList, поэтому, если вы добавите в него элемент, он будет показан на сцене.

person galovics    schedule 07.10.2014
comment
Ok. Как насчет моего другого вопроса? Как мне динамически добавить больше детей в группу после того, как я уже создал свою сцену? - person Alex K; 07.10.2014
comment
Вы можете просто добавить его в список, полученный методом getChildren. - person galovics; 07.10.2014
comment
Ok. И это добавит его на сцену без необходимости обновлять что-либо еще? - person Alex K; 07.10.2014
comment
Да, потому что JavaFX использует коллекции Observable. Если произойдет какая-либо модификация, прослушиватель коллекции вызовет JavaFX для перерисовки сцены. - person galovics; 07.10.2014
comment
Замечательно. Последний вопрос - есть ли способ получить группы, которые добавляются в сцену? Итак, если я передам сцену другому методу, я могу получить группу, выполнив что-то вроде scene.getGroups() или что-то в этом роде. Или мне тоже ОБЯЗАТЕЛЬНО пройти вместе с группой? - person Alex K; 07.10.2014
comment
Сцена использует древовидную иерархию. Есть только один корневой элемент, в вашем случае "группа". Вы можете добавить дополнительные группы в эту корневую группу, и если вы хотите получить ранее добавленные группы, вы можете вызвать getChildren в корневой группе. Затем выполните итерацию по списку и проверьте, является ли элемент группой. (узел instanceof Group) - person galovics; 07.10.2014
comment
Спасибо. Итак, я могу вызвать что-то вроде scene.getRoot().getChildren(), затем выполнить цикл и использовать node instanceOf ____, чтобы получить все, что я хочу? - person Alex K; 07.10.2014
comment
Есть ли способ назвать группы, если у меня есть несколько групп, чтобы их было легче различать позже, когда я выполню getChildren()? - person Alex K; 07.10.2014
comment
Для этого нет встроенной опции. Но вы можете создать класс, который является подклассом группы и имеет поле String с именем. Но когда вы перебираете дочерние элементы, убедитесь, что вы привели его к вновь созданному типу. - person galovics; 07.10.2014