Динамически добавлять виджеты на сцену через fxml или конструктор сцен в JavaFX - PullRequest
0 голосов
/ 01 марта 2019

Я работаю над простым BeatBox, где играют разные звуки в зависимости от выбранных флажков.

Программа должна иметь 256 флажков, отображаемых в сетке 16x16.Поэтому, когда я создаю графический интерфейс с помощью прямого кода (т.е. без fxml или построителя сцены), я могу легко создать простой цикл для создания 256 флажков, добавить их в список, чтобы я мог использовать их позже, и добавить их всетка.

Я пытаюсь изменить этот подход и сделать это с помощью построителя сцены или кодирования непосредственно в файле fxml, но я не могу найти способ сделать это, и я даже не знаю, если этовозможно.Пытаясь выяснить это, я столкнулся с таким сомнением: - Есть ли способ создать список виджетов какого-либо типа, заполненный множеством компонентов (для моего данного примера, список с 256 флажками), через fxml или конструктор сцен?, а затем есть ссылка на список в моем классе Controller?

Мне действительно не нравится идея перетаскивания 256 флажков в построителе сцены или даже создания 256 тегов в fxml.И я думаю, что эта функция может быть полезна для многих других случаев.Так что, если это возможно, я бы хотел помочь.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 марта 2019

Формат FXML не обеспечивает способ объявления элементов в цикле.Поскольку Scene Builder является просто WYSIWYG редактором для файлов FXML, он также не предоставляет эту функциональность и не предоставляет ярлык для объявления и настройки 256 элементов (например, через диалог иличто-то).Это один из тех случаев, когда добавление узлов в коде является правильным решением.

Для этого вам необходимо связать файл FXML с контроллером.Оттуда вы можете создать все 256 CheckBox в методе initialize.Этот метод происходит из интерфейса Initializable, хотя, начиная с JavaFX 8, вам больше не нужно реализовывать интерфейс.Вместо этого вы просто объявляете метод без аргументов с именем initialize (см. this ) и комментируете его с помощью @FXML, если не public.

Вот небольшой пример:

Файл FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>

<!-- replace with your root -->
<HBox xmlns="http://javafx.com/javafx/11.0.2" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="com.example.Controller">

    <GridPane fx:id="grid"/>

    <!-- other elements... -->

</HBox>

Контроллер

package com.example;

import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.GridPane;

public class Controller {

    @FXML private GridPane grid;
    private CheckBox[][] boxes; // for access by grid coordinates

    @FXML
    private void initialize() {
        boxes = new CheckBox[16][16];
        for (int row = 0; row < boxes.length; row++) {
            for (int col = 0; col < boxes[0].length; col++) {
                CheckBox box = new CheckBox();
                grid.add(box, col, row);
                boxes[row][col] = box;
            }
        }
    }

}
...