Получение значений всех полей XML в контроллере при использовании Form

Здравствуйте у меня есть форма XML для ввода различных данных и в контроллере чтобы мне получить эти данные я могу заинжектировать данное поле и через getValue() получить значение, но эти значения я хочу класть в словарь по id и value и если у меня допустим 100 полей, то будет громоздко инжектировать каждое поле и потом через put вставлять в словарь. Есть ли возможность заинжектировать только Form или какой нибудь другой бин, пройтись по всем его компонентам циклом и достать getId и getValue каждого поля для дальнейшего добавления в словарь?

Экран имеет метод: Screen.getWindow().getComponents();

Добрый день!

Компонент Form умеет возвращать коллекцию полей по номеру колонки (form.getComponents(int)). Стоит обратить внимание, форма умеет содержать не только поля, поэтому возращается тип Collection<Component> и при итерации нужно проверять что компонент реализует интерфейс HasValue.

Например:

Map<String, Object> fieldValues = new HashMap<>();
for (int i = 0; i < form.getColumns(); i++) {
    for (Component component : form.getComponents(i)) {
        if (component instanceof HasValue) {
            fieldValues.put(component.getId(), ((HasValue<?>) component).getValue());
        }
    }
}

Добрый день. А если мой xml выглядит вот так, я тогда не могу получать каждое значение с полей.

<form id="form">

                <vbox>
                    <label value="msg://geographicalСoordinatesShip"/>
                    <textField id="geographicalСoordinatesShipField" datatype="string"/>
                </vbox>

                <vbox>
                    <label value="msg://classNS"/>
                    <textField id="classNSField" datatype="string"/>
                </vbox>

                <vbox>
                    <label value="msg://DateTimeOccurrenceNA"/>
                    <dateField id="DateTimeOccurrenceNAField" datatype="LocalDateTime"/>
                </vbox>

                <vbox spacing="true">
                    <radioButtonGroup id="availabilityClassifiedInformationNAField"
                                      caption="msg://availabilityClassifiedInformationNA"
                                      optionsEnum="com.consyst.isopas.entity.YesNo"
                                      orientation="horizontal"/>
                </vbox>

                <vbox>
                    <label value="msg://damagedSystem"/>
                    <textArea id="damagedSystemField"
                              height="100px"
                              width="95%"/>
                </vbox>

                <vbox id="messagePrepared">
                    <label width="100%" value="msg://messagePrepared"/>
                    <textField caption="msg://post" id="postPreparedField" datatype="string"/>
                    <textField caption="msg://initialsSurname" id="initialsSurnamePreparedField" datatype="string"/>
                    <dateField caption="msg://time" id="DatePreparedField" datatype="LocalDateTime"/>
                </vbox >

                <vbox id="main2">
                    <button id="acceptBtn2" align="TOP_RIGHT"/>
                </vbox>
            </form>

Тогда наверное только получить все компоненты на экране и в цикле отбирать нужные
Screen.getWindow().getComponents();

Получилось добиться эффекта вот таким способом, но теперь проблема в том что мои фрагменты наследуются от одного главного и таким перебором, я достаю все поля с родительского и с дочернего фрагмента, но мне нужно доставать только с дочернего.

    public Map<String, Object> onAcceptChildFragment() {
        for (Component component : getFragment().getComponents()) {
            if (component instanceof Field){
                additionalData.put(component.getId(), ((Field<?>) component).getValue());
            }
        }
        return additionalData;
    }