自定义菜单无法达到 loadMenuConfig的菜单tab切换效果

我创建了composite project,subproject的menu加载为了不互相影响,使用了代码的方式初始化sideMenu,但是发现菜单项点击后在workarea区域的菜单tab展示,无法达到自动加载menu.xml的页面交互效果(自动复用历史已打开页签、已打开页签自动至前),有什么解决办法吗?

我创建了composite project,subproject的menu加载为了不互相影响,使用了代码的方式初始化sideMenu:
image
但是发现菜单项点击后在workarea区域的菜单tab展示,无法达到自动加载menu.xml的页面交互效果(自动复用历史已打开页签、已打开页签自动至前),反复点击会打开新的tab:
企业微信截图_16853480651629
请问有什么解决办法吗?感谢!

Jmix 不推荐通过编码的方式管理能直接打开的界面菜单,而是通过 Single Mode 菜单模式管理

在这种模式下,Jmix不会主动加载subproject的菜单,需要你手动添加。

single mode看到了,但是我是一个composite project, 只有一个application,子模块的菜单我是放到 addon中的,子模块的single mode菜单,可以不同子模块单独加载自己的菜单吗?
image
不同模块点击进去显示不同的菜单:
image

单独的addon是运行不起来的,也就是说addon中的菜单,放到App里面才有意义。子模块的菜单在addon中定义是没问题的。在App选single mode时,会弹出提示是否保留addon的菜单以供编辑,这里可以删除不想要的addon菜单或者添加新的菜单。

这个是希望在Jmix app中点击某个模块切换主菜单的内容吗?

这个是希望在Jmix app中点击某个模块切换主菜单的内容吗?——是的

我们实现过一个隐藏菜单的功能,这里用作小示例:

  1. 在menu.xml给menu或menuItem都设置id
  2. 定义一个菜单变化的Event:
public class MenuChangeEvent extends ApplicationEvent {
    private String hideMenuItemId;
    public MenuChangeEvent(Object source,String hideMenuItemId) {
        super(source);
        this.hideMenuItemId = hideMenuItemId;
    }

    public String getHideMenuItemId() {
        return hideMenuItemId;
    }

    public void setHideMenuItemId(String hideMenuItemId) {
        this.hideMenuItemId = hideMenuItemId;
    }
}
  1. 在某个页面,有两个按钮,用来控制隐藏某个菜单:
    <layout>
        <hbox spacing="true">
            <button id="onlyTestItem" caption="隐藏admin"/>
            <button id="onlyTestItem2" caption="隐藏app"/>
        </hbox>
    </layout>
  1. 该页面的控制器,按钮点击是发送需要隐藏的菜单事件。
    @Autowired
    private UiEventPublisher uiEventPublisher;

    @Subscribe("onlyTestItem")
    public void onOnlyTestItemClick(Button.ClickEvent event) {
        uiEventPublisher.publishEvent(new MenuChangeEvent(this,"administration"));
    }

    @Subscribe("onlyTestItem2")
    public void onOnlyTestItem2Click(Button.ClickEvent event) {
        uiEventPublisher.publishEvent(new MenuChangeEvent(this,"application"));
    }
  1. MainScreen.java 中,监听菜单修改事件,并隐藏相应的菜单:
    @EventListener
    public void hideMenuItem(MenuChangeEvent event){
        var menuId = event.getHideMenuItemId();

        if(StringUtils.isBlank(menuId))
            return;

        var menuItems = sideMenu.getMenuItems();

        menuItems.forEach(m->{
            m.setVisible(!menuId.equals(m.getId()));
        });
    }

效果:
menu

当然了,你的需求是显示某个菜单,可以根据这个思路修改实现。

太强了!感谢这么快回复!多谢了

有线下联系方式吗?看能否寻求进一步合作