Подключение аддона Vaadin с интеграцией в Generic UI

Добрый день!

Даныый вопрос хорошо реализуется для примера в случае прописывания нового компонента в Fieldgroup. вот для- “Использование компонента в экране внутри произвольного контейнера” записи в БД для поля score в Customer. не происходит. По видимому он тоже должен обрабатываться в CustomerEdit.java, но как его подхватиь?!

Спасибо за ответы

Здравствуйте,

Предполагается, что если вы не связываете поле с источником данных, то вы воспользуетесь API компонента и подпишетесь на его события. Затем при обработке события внесёте изменения в сущность/сущности в экране.
Например:

TextField textField = componentsFactory.createComponent(TextField.class);
textField.addValueChangeListener(event -> {
    getItem().setFirstName("Mr. " + event.getValue());
});

Поле в с источником данных связано в CustomerEdit.xml, как указано в руководстве:


<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<window xmlns="[url=http://schemas.haulmont.com/cuba/window.xsd"]http://schemas.haulmont.com/cuba/window.xsd"[/url]; 
        xmlns:app="[url=http://schemas.kraiush.ru/agd/0.1/ui-component.xsd"]http://schemas.kraiush.ru/agd/0.1/ui-component.xsd"[/url]; 
        caption="msg://editorCaption" 
        class="ru.kraiush.web.customer.CustomerEdit" 
        datasource="customerDs" 
        focusComponent="fieldGroup" 
        messagesPack="ru.kraiush.web.customer"> 
    <dsContext> 
        <datasource id="customerDs" 
                    class="ru.kraiush.entity.Customer" 
                    view="_local"/> 
    </dsContext> 
    <dialogMode height="600" 
                width="800"/> 
    <layout expand="windowActions" 
            spacing="true"> 
        <fieldGroup id="fieldGroup" 
                    datasource="customerDs"> 
            <column width="250px"> 
                <field property="name"/> 
             </column> 
        </fieldGroup> 
        <app:stepper id="stepper" datasource="customerDs"  
                                   property="score" caption="Score" 
                                   minValue="1" maxValue="20"/>         
        <frame id="windowActions" 
               screen="editWindowActions"/> 
    </layout> 
</window>

Если поле реализовано верно и метод setDatasource связывает поле со свойством сущности, то изменения поля должны автоматически попадать в сущность. А затем, при сохранении записи Customer в БД. Проверьте, что вы верно реализовали поле и его Loader действительно проставляет источник данных при загрузке XML.

Добрых дел!
Проект созданные один к одному из документации работает точно так же: stepper не привязан к базе данных- не читает и не записывает. попытки сгенерить контроллер экрана- CustomerEdit.java результата не приносят!

Не могли бы вы прикрепить тестовый проект, в котором у вас не работает запись в БД? Опишите, пожалуйста, шаги для воспроизведения и результат, который вы ожидаете.

добрый день!
Все шаги делаются так как описано начиная с названия проекта.

если steppper не привязывать к score, то все работает, если прописывать его как произвольный vaadin, то score при входе в customer.edit всегда 0, его можно поменять самим stepper, но при сохранениии --> Ok значение в score не сохраняется.

Если вы просто размещаете компонент на экране, то вы должны сами проставить значение из сущности в компонент в методе postInit и подписаться на событие изменения значения в компоненте. Я смогу подказать вам, что работает не так и что изменить, если увижу что вы делаете и как это работает. В отрыве от кода я не могу помочь вам.

Вот этот проект. убрал тоолько gwt в web-toolkit

modules.zip (2.5M)

В документации пропущен важный вызов в com.company.addonguidemo.gui.xml.layout.loaders.StepperLoader:


@Override
public void loadComponent() {
    super.loadComponent(); // потерян вызов super

Добавьте эту строку в ваш StepperLoader и биндинг данных заработает. Простановка datasource осуществляется AbstractFieldLoader, поэтому нужно вызвать super чтобы она заработала.

Тогда в CustomerEdit останется только назначить Score по-умолчанию для новых записей:

public class CustomerEdit extends AbstractEditor<Customer> {
    @Override
    protected void initNewItem(Customer item) {
        super.initNewItem(item);

        item.setScore(1);
    }
}

Спасибо!

Теперь стараюсь понять как размещать какой-либо графический элемент (button) в произвольном месте экрана.
Начал с Groupbox, хотя по-видимому потребуется CSSLayout?!

Изложите, пожалуйста, вашу задачу и какие шаги вы пробуете в отдельном топике. Это поможет другим разработчикам быстрее найти похожую проблему

К этой задаче всё-таки добавлю, что функция изменения score теперь работает толко при использовании stepper,
а если вводить в поле score значение вручную (набить цифры)- нет!