2021SC@SDUSC

目录

一、MenuItem

1.MenuItem

2.MenuGroup

二、MenuManager

1.MenuArrayList

2.MenuManager


一、MenuItem

1.MenuItem

MenuItem为JPress的菜单项类,是JPress 的一个module。其包含了菜单项的基本属性。

private String id;
private String text;
private String icon;
private String groupId;
private String url;
private int order = 100;
private String target;

其构造函数中实现了用户菜单项构造和管理员菜单项构造。MenuItem还重写了equals方法,虽然不难,但是可供积累:

@Override
public boolean equals(Object obj) {if (obj == null || obj instanceof MenuItem == false) {return false;}return ((MenuItem) obj).getId().equals(id);
}

MenuItem的equals()先实判断obj是否和MenuItem同一类或者是否是空值,然后再通过MenuItem的id来比较,若它们的id相同,则说明它们相同。

2.MenuGroup

MenuGroup是JPress的菜单组项,包含了菜单组项的基本属性。

private int order = 100;
private String text;
private String icon;
private String id;
private List<MenuItem> items;

可以通过private List<MenuItem> items,很容易看出JPress的带单是二级菜单结构,而不是多级菜单结构。

其items属性不是静态的,那么在初始化类的时候不会初始化items属性。其items属性的创建模式是懒汉式的单例模式。

public void addItem(MenuItem item) {if (items == null) {items = new ArrayList<>();}
​if (items.contains(item)) {return;}
​items.add(item);items.sort(Comparator.comparingInt(MenuItem::getOrder));
}

可以看到,只有在需要添加MenuItem的时候,才会初始化items属性。这样的好处是延迟创建new ArrayList<>()对象,节约资源。但是这样有一个缺点。没有考虑线程安全问题,它是线程不安全的,多个线程处理时可能不能获得同一个实例items。但是考虑到添加MenuItem的操作不是频繁的,且难以出现多线程添加MenuItem的场景,所以这样的缺点可以忽略。

二、MenuManager

1.MenuArrayList

MenuArrayList是JPress中专门用于存储管理菜单组的List,其继承了ArrayList,重写了add方法,实现了sort方法。其add方法中,若

    @Overridepublic boolean add(MenuGroup menuGroup) {if (contains(menuGroup)) {throw new RuntimeException("menuGroup:" + menuGroup + " has exits.");}return sort(super.add(menuGroup));}
​
​
​private boolean  sort(boolean success){if (success) {sort(Comparator.comparingInt(MenuGroup::getOrder));}return success;}

当遇到一些比较重要的类时,可以考虑写一个专门的List来管理该类。

2.MenuManager

MenuManager是JPress管理菜单组的类,其继承了JbootEventListener,会在JPress项目运行的时候启动。其所有属性都使用了懒汉式的构建方式。类加载时就在静态区创建了MenuManager实例。

同时,该类被创建时,就自带了系统菜单列表,模板菜单列表,用户财务菜单等私有属性。在类初始化阶段就会初始化后台的固定菜单、初始化后台的 module菜单、初始化用户中心菜单。

假设要初始化系统菜单组,具体的初始化方式如下:

if (JPressMenuConfig.me.isWechatEnable()) {MenuGroup wechatMenuGroup = new MenuGroup();wechatMenuGroup.setId(JPressConsts.SYSTEM_MENU_WECHAT_PUBULIC_ACCOUNT);wechatMenuGroup.setText("微信");wechatMenuGroup.setIcon("<i class=\"fab fa-weixin\"></i>");systemMenus.add(wechatMenuGroup);
}

可以看到,系统会先判断菜单配置,查看微信菜单项是否可用,然后会实例化一个菜单组。菜单组的ID为一个字符串常量,用JPressConsts类保存。setIcon设置了h5的代码。最后把这个菜单组放到systemMenus列表中存储。

【JPress】Menu相关推荐

  1. 【ASP】Menu菜单导航

    描述:使用Menu控件,编码实现导航效果 <?xml version="1.0" encoding="utf-8" ?> <Root> ...

  2. 【解决】Menu XXX/XXX/XXX can‘t be checked because doesn‘t exist

    开发平台:Unity 编程平台:Visual Studio 2022 使用语言:C#   问题描述   Menu XXX/XXX/XXX can't be checked because doesn' ...

  3. 【JPress】Attachment

    2021SC@SDUSC 目录 一.Attachment 二.AttachmentDownloader 一.Attachment Attachment类是io.jpress.model包下的附件类,映 ...

  4. 【JPress】简介、Linux部署与项目分析

    2021SC@SDUSC 目录 一.简介 二.部署 1.安装环境 2.部署步骤 3.解决错误 三.项目分析 1.目录结构 2.jpress架构 3.团队分析与分工 一.简介 JPress 是一个使用 ...

  5. 【Android】Menu菜单详解——实战微信菜单

    简单介绍一下自己,大三学生党一枚!主攻Android开发,对于Web和后端均有了解. 个人语录:取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客. 菜单在Android中可谓必不可少, ...

  6. 【NFC】Android NFC API Reference中英文

    SkySeraph 博客园 首页 新随笔 联系 订阅 管理 随笔- 192  文章- 0  评论- 441  [NFC]Android NFC API Reference中英文 [NFC]Androi ...

  7. 【数据结构】单链表的实现(C语言)

    单链表是线性表链式储存的一种形式,其中的结点一般含有两个域,一个是存放数据信息的info域,另一个是指向该结点后继结点存放地址的指针next域.一个单链表必须要有一个首指针指向链表中的第一个结点. 单 ...

  8. 【数据结构】顺序队列的实现(C语言)

    队列的基本概念及其描述 队列是一种特殊的线性表,它的特殊性在于队列的插入和删除操作分别在表的两端进行. 插入的那一端称为队尾,删除的那一端称为队首.队列的插入操作和删除操作分别称为进队和出队. 先进先 ...

  9. 【数据结构】顺序栈的实现(C语言)

    栈的基本概念及其描述 栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入操作和删除操作的那一端称为栈顶,另一端称为栈底. 栈的插入操作和删除操作分别称为进栈和出栈. FI ...

  10. android 创建3个按钮,【记录】继续尝试给Android程序的右上角的ActionBar中添加三个点的选项按钮...

    [背景] 想要给Android中的ActionBar中添加那种三个点的选项菜单,之前已经折腾过了,但是失败了,以为新版Android中没法添加呢: 但是后来在别的4.1.2的Android手机中,也还 ...

最新文章

  1. python怎么建立画板_Python基于opencv实现的简单画板功能示例
  2. 概率论-1.2概率的定义及其确定方法
  3. PHP curl采集
  4. 我是这样入侵 Hacking Team 的
  5. Node 之 模块加载原理与加载方式
  6. css,html走的坑:(1.2)
  7. MVC中的cshtml与ASPX的区别
  8. Linux内核源代码分析——中断(一鞭一条痕)(下)
  9. python小明爬楼梯_爬楼梯(Python and C++解法)
  10. WorldList5
  11. 【Matlab身份证识别】BP神经网络身份证号码识别【含源码 1344期】
  12. 比较全的OA系统功能模块列表
  13. 【Unity3d】U3d灯光
  14. NLP+词法系列(一)︱中文分词技术小结、几大分词引擎的介绍与比较
  15. 惊艳全网的裸眼3D巨屏,竟是一场视觉骗局?
  16. 开发中,GA、Beta、GA、Trial到底是什么含义
  17. oracle remap schema,oracle 10g DATA PUMP 的REMAP_SCHEMA和REMAP_TABLESPACE的功能
  18. Android中多个style,Android设计规范 Material Design-Style(4图像)
  19. 除尘机器人毕业_【干货】焊接机器人除尘方式
  20. 有趣的兔子(斐波那契数列)

热门文章

  1. element组件的表单验证手机号
  2. pvt检查是什么意思_EVT、DVT、PVT是什么意思
  3. svg html g标签id,svg是什么?svg常用的方法(附代码)
  4. 【LeetCode刷题】1619. 删除某些元素后的数组均值
  5. 知言:《第一行代码》作者郭霖:不要成为工具的奴隶
  6. 做一个企业网站需要多少钱?
  7. 【哈工大SCIR】多模态情感分析简述
  8. 小程序商品数据对象累加加入购物车缓存导致的数组嵌套在上一层数组中的问题
  9. 阿里云后台部署全过程-2-Linux环境配置
  10. 【强化学习论文精读】Timeliness Guaranteed Traffic Flow Forecasting Based on Federated Online Learning