在scout eclipse中扩展表单数据

时间:2014-09-23 11:32:42

标签: templates extends form-data eclipse-scout

我有一些抽象的形式:

 @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 {
    }
  }
}

FOR REAL FORM您只需从模板创建表单:

Eclipse Scout: create new form

并在主框中添加MyTable,如:

insted:

@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

我承认在抽象形式中创建主框可能不是正确的方法,但我想要实现的是在AbstractMyFormData中有AbstractMyTableField,所以我可以依赖于服务器端所有从AbstractMyForm扩展的表单在表单数据中有这个,所以我只能为所有表单编写一个服务器方法(返回AbstractMyFormData)。

1 个答案:

答案 0 :(得分:0)

FormData和表单层次结构

formData层次结构反映了表单层次结构。如果您的表单层次结构如下所示:

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

您的formData层次结构如下所示:

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

不要定义MainBox两次

以您为例,您绝对正确SDK生成的代码包含编译错误。

我试图在your question about form template中解释它,但在表单模板中有一个主框并且在具体形式中有一个主框没有任何意义。

每个表格包含:

  • 0..n变量
  • 0..n Key Strokes(实现IKeyStroke的内部类)
  • 正好1个主框(实现IGroupBox的内部类)
  • 0..n ToolButtons(实现IToolButton的内部类)
  • 1..n Form Handler(通常定义为实现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是否应该是外部类。你可以自己尝试一下:

Template support

选中或取消选中“创建外部FormData”复选框。您可以比较输出(生成的类)和@FormData注释。

2 /对于TableData,您可以决定formData中的结构如何(基于bean或基于数组)。见TableData on the eclipse wiki

@FormData注释的JavaDoc中描述了不同选项的用法。


如果您已将某个字段从一个类移动到另一个类,我建议您使用SDK重新生成所有FormDatas。 (scout explorer中的“更新所有formData类”)。这可能会解决您的编译问题。