1

我有一些抽象形式:

 @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描述可能是它,但我现在不知道如何使用它。

女巫可能相关的第二个问题是如何像普通的 AbstractForm 注入取消按钮一样在 AbstractMyForm 中注入表?

编辑 :

类代码:

抽象形式

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

对于 REAL FORM,您只需从模板创建表单:

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)。

4

1 回答 1

0

FormData 和 Form 层次结构

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 我本来预计会出现编译错误(从纯 java 的角度来看),但它似乎有效。

在运行时 scout 选择两个MainBox类之一并将其用作字段树的根。我什至不确定所选MainBox内容是否由 scout 明确定义,或者您是否只是随机获得两者之一(取决于 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 中的结构的外观(基于 bean 或基于数组)。请参阅Eclipse wiki 上的 TableData

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


如果您将某些字段从一个类移动到另一个类,我建议您使用 SDK 重新生成所有 FormData。(侦察资源管理器中的“更新所有 formData 类”)。这可能会解决您的编译问题。

于 2014-09-23T14:08:42.593 回答