多tab界面,table点击问题

  1. A页面有tab1和tab2,里面分别由Table1和Table2(使用同样的entity E)
  2. 当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);
        }
    }

}

效果:
prod

2 个赞

:+1::+1::+1::+1:太强了