Расширяет данные формы в разведывательном затмении
У меня есть какая-то абстрактная форма:
@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 {
}
}
}
ДЛЯ РЕАЛЬНОЙ ФОРМЫ вы просто создаете форму из шаблона:
и в главном окне добавить 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" в проводнике разведчиков). Это может решить вашу проблему с компиляцией.