- A页面有tab1和tab2,里面分别由Table1和Table2(使用同样的entity E)
- 当B页面使用E的entityPicker时,tab1的页面Table1点击列表选中该记录
tab2的页面Table2点击列表选中却进入编辑界面
请问如何时tab1和tab2的列表点击都是选中记录呢?
页面 B 和页面 A 有什么关系吗?
比如A页面商品,分为水果和蔬菜
B页面要选一种商品
就是 B 页面需要调用 A 页面来选择,但是你发现tab1 里面选择是可以的,tab2里面的表格点击却变成了编辑是吗?
是这样的
这个是因为 @LookupComponent
注解目前只支持一个选择组件(表格),多tab时,页面会有多个选择组件,所以不支持。需要自定义。
我写了一个 MultiComponentLookup
支持多个选择组件,可以拷贝到你的项目中。基本思路是扩展一下 StandardLookup
:
package com.company.leot;
import com.google.common.base.Strings;
import io.jmix.ui.action.Action;
import io.jmix.ui.component.Component;
import io.jmix.ui.component.ListComponent;
import io.jmix.ui.component.LookupComponent;
import io.jmix.ui.screen.StandardLookup;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
public class MultiComponentLookup<T> extends StandardLookup<T> {
protected List<String> lookupComponentIds;
protected LookupComponent<T> currentLookupComponent;
@Override
protected void setupLookupComponent() {
super.setupLookupComponent();
}
public void setLookupComponent(LookupComponent<T> lookupComponent){
if(lookupComponentIds == null){
getLookupComponentIds();
}
if (!lookupComponentIds.contains(lookupComponent.getId())) {
throw new IllegalStateException(
String.format("@LookupComponent's value doesn't include %s", lookupComponent.getId())
);
}
if(currentLookupComponent != null && !currentLookupComponent.getLookupSelectedItems().isEmpty()){
if(currentLookupComponent instanceof ListComponent){
((ListComponent<?>) currentLookupComponent).setSelected(new ArrayList<>());
}
}
currentLookupComponent = lookupComponent;
}
@Override
protected LookupComponent<T> getLookupComponent() {
if(currentLookupComponent != null){
return currentLookupComponent;
}
currentLookupComponent = getLookupComponents().get(0);
return currentLookupComponent;
}
protected List<String> getLookupComponentIds(){
if(lookupComponentIds != null){
return lookupComponentIds;
}
io.jmix.ui.screen.LookupComponent annotation =
getClass().getAnnotation(io.jmix.ui.screen.LookupComponent.class);
if (annotation == null || Strings.isNullOrEmpty(annotation.value())) {
throw new IllegalStateException(
String.format("MultiComponentLookup %s does not declare @LookupComponent", getClass())
);
}
String[] tokens = annotation.value().replaceAll("\\s+", "").split(",");
lookupComponentIds = List.of(tokens);
return lookupComponentIds;
}
@SuppressWarnings("unchecked")
protected List<LookupComponent<T>> getLookupComponents() {
List<String> tokens = getLookupComponentIds();
return tokens.stream().map(t -> (LookupComponent<T>) getWindow().getComponentNN(t)).toList();
}
@Override
@SuppressWarnings("unchecked")
public void setSelectHandler(@Nullable Consumer<Collection<T>> selectHandler) {
this.selectHandler = selectHandler;
Component lookupActionsLayout = getLookupActionsLayout();
if (lookupActionsLayout != null) {
lookupActionsLayout.setVisible(true);
List<LookupComponent<T>> lookupComponents = getLookupComponents();
Action commitAction = getWindow().getAction(LOOKUP_SELECT_ACTION_ID);
lookupComponents.forEach(l->{
if(l instanceof LookupComponent.LookupSelectionChangeNotifier){
((LookupComponent.LookupSelectionChangeNotifier<T>) l).addLookupValueChangeListener(valueChangeEvent->
commitAction.setEnabled(!l.getLookupSelectedItems().isEmpty()));
}
});
commitAction.setEnabled(!getLookupComponent().getLookupSelectedItems().isEmpty());
}
}
}
用法:
package com.company.leot.screen.product;
import com.company.leot.MultiComponentLookup;
import io.jmix.ui.component.GroupTable;
import io.jmix.ui.component.TabSheet;
import io.jmix.ui.screen.*;
import com.company.leot.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
@UiController("leot_Product.select")
@UiDescriptor("product-select.xml")
@LookupComponent("productsLsTable,productsYlTable") // 有多个表格时,依次写入,以逗号分隔。这里会报一个warning,可以不用管。
public class ProductSelect extends MultiComponentLookup<Product> { // 这里需要修改继承自上面的新类
@Autowired
private GroupTable<Product> productsLsTable;
@Autowired
private GroupTable<Product> productsYlTable;
// 根据页面逻辑,在切换选择组件时,需要调用 #setLookupComponent,因为父类并不知晓页面逻辑。
@Subscribe("selectTab")
public void onSelectTabSelectedTabChange(final TabSheet.SelectedTabChangeEvent event) {
var selectedTab = event.getSelectedTab();
if(selectedTab.getName().equals("ylTab")){
setLookupComponent(productsYlTable);
}else if (selectedTab.getName().equals("lsTab")){
setLookupComponent(productsLsTable);
}
}
}
效果:
2 个赞
太强了