Расширяет данные формы в разведывательном затмении

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

 @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

и чем скаут жалуется, что имеет дублирующий метод 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 {

}

делать:

 @Order(10.0)
 public class MainBox extends AbstractGroupBox {

     @Order(10.0)
     public class MyTable extends AbstractMyTableField {

     }
 }

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

РЕДАКТИРОВАТЬ 2

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

1 ответ

FormData и Форма иерархии

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

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

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

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

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

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

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

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

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

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

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

Во время выполнения разведчик выбрать один из двух 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". Вы можете сравнить вывод (сгенерированные классы) и @FormData аннотаций.

2 / Для TableData вы можете решить, как будет выглядеть структура в formData (на основе бина или на основе массива). Посмотрите TableData на вики затмения

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


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

Другие вопросы по тегам