[]
默认情况下,如果一个属性的类型是对象类型,这个类型又包含了一些子属性,那么可以通过标注@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 "我的服务端命令插件";
}
}
在设计器中效果如下:
对象的子属性也可以通过注解来控制属性编辑控件
下面例子中,额外声明了一个属性使用公式编辑器。具体标注的用法请参考之前的章节。
@Data
public class MyObj extends ObjectPropertyBase {
private String name;
private String description;
@FormulaProperty
private Object formulaProperty;
}
在设计器中效果如下:
给对象添加自定义校验
自定义对象实现 IObjectCustomValidate 接口,并实现 validate() 方法。
代码
@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;
}
}
设计器时效果
内嵌显示
给对象字段 标注 @FlatObjectProperty 注解可以实现对象的内嵌显示
代码
@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;
}
设计时效果
内嵌显示联动
给对象字段标注 @FlatObjectProperty 注解实现子对象属性内嵌显示,同时通过属性值联动在不同情况下显示不同的子属性。
代码
@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;
}
设计器效果