Расширяет данные формы в scout eclipse

У меня есть абстрактная форма:

 @FormData(value = AbstractMyFormData.class, sdkCommand = FormData.SdkCommand.CREATE)
 public abstract class AbstractMyForm extends AbstractForm {

    ...
    @Order(10.0)
    @ClassId("MyForm.MyTable")
    public class MyTable extends AbstractMyTableField {
    ...
    }

 }

Эти данные формы содержат некоторую таблицу (класс MyTable в качестве шаблона) внутри:

public abstract class AbstractMyFormData extends AbstractFormData {

    private static final long serialVersionUID = 1L;

    public AbstractMyFormData() {}

    public MyTable getMyTable() {
        return getFieldByClass(MyTable.class);
    }

    public static class MyTable extends AbstractMyTableData {

        private static final long serialVersionUID = 1L;

        public MyTable() {}
    }
}

Моя реальная форма расширяет AbstractMyForm :

@FormData(value = MyFormData.class, sdkCommand = FormData.SdkCommand.CREATE)
public class MyForm extends AbstractMyForm {

    ...
    @Order(10.0)
    @ClassId("MyForm.MyTable")
    public class MyTable extends AbstractMyTableField {
    ...
    }

}

данные формы для этого:

 public class MyFormData extends AbstractMyFormData {
      public MyTable getMyTable() {
          return getFieldByClass(MyTable.class);
      }

      public static class MyTable extends AbstractMyTableData {

          private static final long serialVersionUID = 1L;

          public MyTable() {}
      }
      .....
      .....
 }

Проблема в том, что обе формы данных (AbstractMyFormData и MyFormData) реализованы

public static class MyTable extends AbstractMyTableData

и чем scout жалуется, что имеет дублирующийся метод getMyTable().

Но я этого не понимаю. Если MyFormData расширяется от AbstractMyFormData, то MyFormData не должен иметь этот метод внутри, потому что он уже есть его родителем.

Как это сделать? Я вижу FormData.SdkCommand.USE, что по описанию может быть им, но я не знаю, как его использовать.

Второй вопрос, который может быть связан с этим, заключается в том, как внедрить таблицу в AbstractMyForm, как обычную кнопку «Отмена» вставки AbstractForm?

ИЗМЕНИТЬ:

Код для классов:

РЕЗЮМЕ

@FormData(value = AbstractPurchasePriceFormData.class, sdkCommand = FormData.SdkCommand.CREATE)
@ClassId("41f0f405-b257-47e7-accf-270f5be158ce")
public abstract class AbstractMyForm extends AbstractForm {

    /**
    * @throws org.eclipse.scout.commons.exception.ProcessingException
    */
    public AbstractMyForm() throws ProcessingException {
        super();
    }

    @Order(10.0)
    public class MainBox extends AbstractGroupBox {

        @Order(10.0)
        public class MyTable extends AbstractMyTableField {

        }
    }


    @Override
    protected String getConfiguredTitle() {
        return TEXTS.get("AbstractMyForm");
    }
}

Шаблон AbstractMyTableField:

import org.eclipse.scout.commons.annotations.FormData;
import org.eclipse.scout.commons.annotations.Order;
import org.eclipse.scout.rt.client.ui.basic.table.columns.AbstractIntegerColumn;
import org.eclipse.scout.rt.client.ui.basic.table.columns.AbstractStringColumn;
import org.eclipse.scout.rt.client.ui.form.fields.tablefield.AbstractTableField;
import org.eclipse.scout.rt.extension.client.ui.basic.table.AbstractExtensibleTable;

@FormData(value = AbstractMyTableFieldData.class, sdkCommand = FormData.SdkCommand.CREATE, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE)
public abstract class AbstractMyTableField extends AbstractTableField<AbstractMyTableField.Table> {

  @Order(10.0)
  public class Table extends AbstractExtensibleTable {
    @Order(10.0)
    public class NameColumn extends AbstractStringColumn {
    }

    @Order(20.0)
    public class AgeColumn extends AbstractIntegerColumn {
    }
  }
}

ДЛЯ РЕАЛЬНОЙ ФОРМЫ вы просто создаете форму из шаблона:

Eclipse Scout: создать новую форму

и в основном поле добавьте MyTable, например:

установлено:

@Order(10.0)
public class MainBox extends AbstractGroupBox {

}

do :

 @Order(10.0)
 public class MainBox extends AbstractGroupBox {

     @Order(10.0)
     public class MyTable extends AbstractMyTableField {

     }
 }

Надеюсь, в этот раз я был более откровенен.

ИЗМЕНИТЬ 2

Я признаю, что создание основного блока внутри абстрактной формы, возможно, не является правильным подходом, но я хочу добиться того, чтобы иметь AbstractMyTableField в AbstractMyFormData, поэтому я могу полагаться на серверную сторону, что все формы, которые расширяются от AbstractMyForm, имеют это в данных формы, поэтому я может написать только один серверный метод для всех форм (возвращающий AbstractMyFormData).


person Marko Zadravec    schedule 23.09.2014    source источник
comment
Можете ли вы расширить свой пример? Даже при наследовании Java между вашими формами у вас может быть только один MainBox (как обсуждалось здесь stackoverflow.com/a/25933620/91497). Использование... для несоответствующего кода допустимо, но в этом случае я не могу скопировать и вставить ваши классы в свою рабочую область, чтобы воспроизвести вашу ошибку.   -  person Jmini    schedule 24.09.2014


Ответы (1)


FormData и иерархия форм

Иерархия formData отражает иерархию формы. Если вы формируете иерархию, то она выглядит так:

MyForm
  |-- PersonForm
  |     \-- VipForm.
  \-- CompanyForm

Ваша иерархия formData выглядит следующим образом:

MyFormData
  |-- PersonFormData
  |     \-- VipFormData
  \-- CompanyFormData

Не определяйте MainBox дважды

С вашим примером, вы совершенно правы, код, сгенерированный SDK, содержит ошибки компиляции.

Я попытался объяснить это в вашем вопросе о шаблоне формы, но нет смысла иметь основное поле в шаблоне формы и в одной в конкретной форме.

Каждая форма содержит:

  • 0..n переменных
  • 0..n Key Strokes (внутренние классы, реализующие IKeyStroke)
  • ровно 1 основной блок (внутренний класс, реализующий IGroupBox)
  • 0..n ToolButtons (внутренние классы, реализующие IToolButton)
  • 1..n Обработчик формы (обычно определяется как внутренние классы, реализующие IFormHandler, но, поскольку обработчик задается как параметр AbstractForm.startInternal(IFormHandler), обработчик может быть определен везде)

В вашем случае, когда вы рассматриваете, как выглядит конкретная форма (MyForm), вы замечаете, что у нее есть два MainBox:

  • один соответствует ConcreteForm.MainBox
  • один, внесенный абстрактным классом и соответствующий AbstractMyForm.MainBox, я ожидал ошибки компиляции (с точки зрения чистой jave), но, похоже, он работает.

Во время выполнения scout выберите один из двух классов MainBox и используйте его как корень дерева полей. Я даже не уверен, хорошо ли выбранный MainBox определен разведчиком или вы просто случайным образом получаете один из двух (в зависимости от того, что вернет интроспекция java Class.getClasses()).

Я не вижу, что гарантирует шаблон, который вы использовали. Вы можете определить что-то еще в основном поле конкретной формы:

@Order(10.0)
public class MainBox extends AbstractGroupBox {

  @Order(10.0)
  public class NameField extends AbstractStringField {

    @Override
    protected String getConfiguredLabel() {
      return TEXTS.get("Name");
    }
  }

  @Order(20.0)
  public class OkButton extends AbstractOkButton {
  }

  @Order(30.0)
  public class CancelButton extends AbstractCancelButton {
  }
}

В этом случае у меня нет таблицы, расширяющей AbstractMyTableField в конкретной форме, даже если одна таблица определена в абстрактном классе, используемом в качестве шаблона формы.


Конфигурация @FormData

Вы можете влиять на создание formData с помощью аннотации formData. Вот два примера:

1/Если вы работаете с групповыми полями, определенными как шаблоны, вы можете решить, должен ли GroupBoxData быть внешним классом или нет. Вы можете попробовать сами:

Поддержка шаблонов

Установите или снимите флажок «Создать внешние данные формы». Вы можете сравнить вывод (сгенерированные классы) и аннотацию @FormData.

2/Для TableData вы можете решить, как будет выглядеть структура в formData (на основе bean-компонентов или массивов). См. TableData на вики-странице eclipse.

Использование различных опций описано в JavaDoc аннотации @FormData.


Если вы переместили какое-то поле из одного класса в другой, я рекомендую вам перегенерировать все FormData с помощью SDK. («Обновить все классы formData» в проводнике). Это может решить вашу проблему компиляции.

person Jmini    schedule 23.09.2014
comment
Спасибо за ответ, но Вы, наверное, не совсем поняли мой вопрос. Моя проблема не с шаблоном полей, а с шаблоном формы. Если у меня есть абстрактная форма A с полем F, а затем у меня есть форма B (не абстрактная) с тем же полем F, разведчик жалуется на это, потому что внутри formData для A и B есть геттер для F, и он говорит, что это одно и то же. Я пытаюсь обновить данные формы, и это не помогло. Я немного обновляю свой вопрос. - person Marko Zadravec; 24.09.2014
comment
Я добавил раздел «Не определяйте MainBox дважды», чтобы объяснить, почему нехорошо иметь 2 класса MainBox. Я снова отредактирую ответ, чтобы рассказать, как я решу вашу проблему. - person Jmini; 25.09.2014