[]
        
(Showing Draft Content)

对象列表属性

如果一个属性的类型是List类型,List的每一项又包含了子属性,那么可以通过标注@ObjectListProperty 注解,使得活字格设计器可以通过弹出二级对话框来编辑该属性。

注意:

  1. itemType 声明的类型必须与项目属性类型一致

  2. 自定义对象必须实现 INamedObject 接口

  3. 自定义对象必须从 ObjectPropertyBase 类派生

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

    @ObjectListProperty(itemType = MyObj.class)
    public List<INamedObject> list;

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

    @Override
    public String toString() {
        return "我的服务端命令插件";
    }
}
@Data
public class MyObj extends ObjectPropertyBase implements INamedObject {

    private String name;
    private String description;
    
}

设计器中效果如下:

image

列表项目的子属性也可以通过注解来控制属性编辑控件。

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

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

    @ObjectListProperty(itemType = MyObj.class)
    public List<INamedObject> list;

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

    @Override
    public String toString() {
        return "我的服务端命令插件";
    }
}
@Data
public class MyObj extends ObjectPropertyBase implements INamedObject {

    private String name;
    private String description;

    @FormulaProperty
    private Object formulaProperty;

    @ComboProperty(valueList = "选项1|选项2|选项3")
    public String type;
}

在设计器中效果如下:

image

如果需要更细致的控制,可以通过@ObjectListProperty 的其他属性来控制。

1.控制列表最大元素个数

  1. 设置 @ObjectListProperty 的 maxCount 属性。

  2. 代码

    @Data
    @Icon("resources/Icon.png")
    public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {
    
        @ObjectListProperty(itemType = MyObj.class,maxCount = 4)
        public List<INamedObject> list;
    
        @Override
        public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
            return new ExecuteResult();
        }
    
        @Override
        public String toString() {
            return "我的服务端命令插件";
        }
    }

2.控制默认结点名称

  1. 设置 @ObjectListProperty 的 defaultName属性。

  2. 代码

    @Data
    @Icon("resources/Icon.png")
    public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {
    
        @ObjectListProperty(itemType = MyObj.class,defaultName = "结点")
        public List<INamedObject> list;
    
        @Override
        public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
            return new ExecuteResult();
        }
    
        @Override
        public String toString() {
            return "我的服务端命令插件";
        }
    }
  3. 设计器表现

    image


@ListProperty Vs @ObjectListProperty

@ListProperty和@ObjectListProperty解决的是完全相同的问题,只是表现方式不同,@ObjectListProperty 更适合项目子属性比较多的情况,而@ListProperty 则在子属性比较少的时候比较适用。