在Windows的“开始”菜单上,会在菜单左侧显示一幅图像。很多基于Windows的软件也有类似效果的菜单。用Java Swing可以制作出类似效果的菜单吗?答案当然是肯定的,而且非常简单。
我们首先从Swing的JPopupMenu组件进行扩展,让其接受一个图片,显示在左侧;或者接受一个字符串,动态生成图片后,在显示在左侧。为了避免准备图片的麻烦,我们就以动态生成内存图片为例,编写一个JImagedPopupMenu类。
JImagedPopupMenu在创建时可以接受一个字符串,生成一副内存图片BufferedImage。然后,我们需要覆盖JComponent的getInsets方法,重新计算Inset的left值,将其在原数值基础上加上图片的宽度,然后返回:
public Insets getInsets() {
Insets insets = (Insets)super.getInsets().clone();
insets.left += imageIcon.getIconWidth();
return insets;
}
最后,覆盖paintComponent方法,在原基础上增加图片的绘制:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (imageIcon != null) {
Insets insets = getInsets();
g.drawImage(imageIcon.getImage(),
我们首先从Swing的JPopupMenu组件进行扩展,让其接受一个图片,显示在左侧;或者接受一个字符串,动态生成图片后,在显示在左侧。为了避免准备图片的麻烦,我们就以动态生成内存图片为例,编写一个JImagedPopupMenu类。
JImagedPopupMenu在创建时可以接受一个字符串,生成一副内存图片BufferedImage。然后,我们需要覆盖JComponent的getInsets方法,重新计算Inset的left值,将其在原数值基础上加上图片的宽度,然后返回:
public Insets getInsets() {
Insets insets = (Insets)super.getInsets().clone();
insets.left += imageIcon.getIconWidth();
return insets;
}
最后,覆盖paintComponent方法,在原基础上增加图片的绘制:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (imageIcon != null) {
Insets insets = getInsets();
g.drawImage(imageIcon.getImage(),