对于我们正在 Jmix 上开发的公司项目 https://www.jmix.io/ 。 我们需要创建 Jmix 到 GUI 到 DB 的交互,以便从实体获取值并将其放在经典 UI 组件上。编辑值并将其保存回数据库。 可能使用 Enum Type 和 multiValuePicker 组件来添加和删除值 以详细形式。
定义枚举以获得我们需要的选择
// www.data-ware.it
public enum it.data-ware.ValueEnum implements EnumClass<String> {
32BIT("32BIT"),
64BIT("64BIT"),
....
}
将组件放置在实体的“详细信息”视图上
<formLayout id="form" dataContainer="nameDc">
<multiValuePicker id="architectureValuePicker" label="Architecture">
<actions>
<action id="select" type="multi_value_select">
<properties>
<!-- mind the gap -->
<!-- we are handling ValueEnum Object -->
<!-- mind the gap -->
<property name="enumClass" value="it.data-ware.example.entity.ValueEnum "/>
</properties>
</action>
<action id="clear" type="value_clear"/>
</actions>
</multiValuePicker>
</formLayout>
在详细信息视图代码表单上,我们需要处理来自 Jmix 的事件 公共类 CustomEntityDetailView 扩展 StandardDetailView { }
首先注入组件valuePicker,定义在xml表单上
@ViewComponent
private JmixMultiValuePicker<Object> valuePicker;
然后订阅onReady事件,以便将组件值填充到UI组件中
// www.data-ware.it
@Subscribe
public void onReady(final ReadyEvent event) {
// ...
final String architecture = getEditedEntity().getArchitecture();
// ...
final String[] architectureParts = architecture.split(";");
final ArrayList<Object> valuePartsEnum = new ArrayList<>();
// ...
for (String architecturePart : architectureParts) {
// mind the gap
// from string to Enum
final ValueEnum item = ValueEnum.fromId(architecturePart);
valuePartsEnum .add(item);
}
// ...
valuePicker.setValue(valuePartsEnum );
}
最后订阅 onBeforeSave 事件以从 UI 获取组件值并将其设置到 Entity 字段上以允许 Jmix 保存它。
@Subscribe
public void onBeforeSave(final BeforeSaveEvent event) {
// ...
getEditedEntity().setArchitecture("");
// set empty field and exit
if (!architectureValuePicker.isEmpty()) {
// ...
final Collection<Object> collection = valuePicker.getValue();
// ...
final StringBuffer architectureParts = new StringBuffer();
// ...
collection.forEach((temp) -> {
architectureParts.append(temp).append(";");
});
// ...
architectureParts.setLength(architectureParts.length() - 1);
final String architecture = architectureParts.toString();
// ...
getEditedEntity().setArchitecture(architecture);
}
}