Здравствуйте у меня есть форма 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;
}