[]
        
(Showing Draft Content)

对象属性

默认情况下,如果一个属性的类型是对象类型,这个类型又包含了一些子属性,那么可以通过标注@ObjectProperty 注解,使得活字格设计器可以通过弹出二级对话框来编辑该属性。

注意,objType属性里声明的类型必须与属性类型一致。

自定义对象的类型应该从 ObjectPropertyBase 类派生。

建议使用@Data 注解,否则需要手动实现所有字段的get set方法,将字段封装成javabean的属性。

@Data
@Icon("resources/Icon.png")
public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {

    @ObjectProperty(objType = MyObj.class)
    private MyObj value;

    @Override
    public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
        return new ExecuteResult();
    }

    @Override
    public String toString() {
        return "我的服务端命令插件";
    }
}

在设计器中效果如下:

image

对象的子属性也可以通过注解来控制属性编辑控件

下面例子中,额外声明了一个属性使用公式编辑器。具体标注的用法请参考之前的章节。

@Data
public class MyObj extends ObjectPropertyBase {
    private String name;
    private String description;

    @FormulaProperty
    private Object formulaProperty;
}

在设计器中效果如下:

image

高级配置

  1. 给对象添加自定义校验

    1. 自定义对象实现 IObjectCustomValidate 接口,并实现 validate() 方法。

    2. 代码

      @Data
      public class MyObj extends ObjectPropertyBase implements IObjectCustomValidate {
          private String name;
          private String description;
      
          @FormulaProperty
          private Object formulaProperty;
      
          @Override
          public String validate() {
              if (formulaProperty == null && description == null)
              {
                  return "formulaProperty 和 Description 属性至少有一个不能为空";
              }
              return null;
          }
      }
    3. 设计器时效果

      image



  2. 内嵌显示

    1. 给对象字段 标注 @FlatObjectProperty 注解可以实现对象的内嵌显示

    2. 代码

      @Data
      @Icon("resources/Icon.png")
      public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {
      
          @DisplayName("姓名")
          public String name;
      
          @FlatObjectProperty
          @DisplayName("地址")
          public Address address = new Address();
      
          @Override
          public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
              return new ExecuteResult();
          }
      
          @Override
          public String toString() {
              return "我的服务端命令插件";
          }
      }
      @Data
      public class Address extends ObjectPropertyBase {
      
          @DisplayName("省份")
          private String province;
          @DisplayName("城市")
          private String city;
      }
    3. 设计时效果

      image


  3. 内嵌显示联动

    1. 给对象字段标注 @FlatObjectProperty 注解实现子对象属性内嵌显示,同时通过属性值联动在不同情况下显示不同的子属性。

    2. 代码

      @Data
      @Icon("resources/Icon.png")
      public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {
      
          @ComboProperty(valueList = "classA|classB")
          public String name =  "classA";
      
          @FlatObjectProperty
          public Object obj = new ClassA();
      
          @Override
          public void refreshPropertyValues(String propertyName, Object propertyValue) {
              if("name".equals(propertyName)){
                  if(propertyValue.toString().equals("classA")){
                      obj = new ClassA();
                  }
                  if(propertyValue.toString().equals("classB")){
                      obj = new ClassB();
                  }
              }
              super.refreshPropertyValues(propertyName, propertyValue);
          }
      
          @Override
          public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
              return new ExecuteResult();
          }
      
          @Override
          public String toString() {
              return "我的服务端命令插件";
          }
      }
      @Data
      public class ClassB extends ObjectPropertyBase {
          private String classBValue;
      
          @ComboProperty(valueList = "AA|BB")
          private String classBValue2;
      }
    3. 设计器效果

      405ed705-64ff-4c8d-85f8-f52ae409b379