要实现个性化菜单最常用的方法是继承JMenuItem类,然后再重写paintComponent方法,但这个作法有几个不足之处,一是不能绘制菜单项在高亮色效果,二是不能重设组合键的字体颜色,三是当菜单项在有无图标时显示菜单文字时出现缩进混乱,四是复选/单选图标显示混乱。为此我特地采用BasicMenuItemUI类实现菜单项的个性化。
BasicMenuItemUI类关于绘画的方法共有四个,而且分工明确很有条理。
paint :当菜单项显示时负责更新重绘菜单项表面。
paintBackgound :绘制菜单项的背景。
paintText :绘制菜单项的文字
paintMenuItem :绘制菜单项
其实这四个方法完全中只要重写一个paint方法是继承时ComponentUI类的,也就是别的UI类都有方法,主要负责画面的更新,而paintBackground用于绘制背景,包括菜单项的高亮显示,paintText用于绘制文字,可在此方法中实现文字的缩进。paintMenuItem将在调用了paintBackground和paintText方法后显示,因此我觉得没必要再重写paintMenuItem方法。
BasicMenuItemUI类内置了一个MouseInputHandler类,可以用于实现鼠标的侦听,可以通过createMouseInputListener方法来实现诸如鼠标移入、移出、按下、释放等功能。
另外BasicMenuItemUI类还有一些属性相当实用的属性
acceleratorForeground:设置组合键字体的颜色
acceleratorSelectionForeground:设置组合键处于高亮时的字体颜色
acceleratorFont:设置组合键文字字体,不过实际测试中没有效果。
另外为了能让子菜单项和其他菜单项拥有相同的界面样式,也可以把用BasicMenuItemUI类实现的子类用于JMenu上,以方便统一的菜单界面样式,但这样做的同时也失去了JMenu自动弹出子菜单的功能,因此可以用再实现一个继承了BasicMenuUI的子类。
这是我做一个简单的演示,一些相关的代码我都做了注解,毕竟代码并不复杂。