在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(),

insets.left - imageIcon.getIconWidth(),

insets.top,

null);

}

}

完整代码如下:

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.awt.image.*;

import javax.swing.*;

public class ImageMenu extends JPopupMenu {

private Font font = new Font("Dialog", Font.BOLD, 13);

private ImageIcon imageIcon = null;

public ImageMenu(ImageIcon imageIcon) {

this.imageIcon = imageIcon;

}

public ImageMenu(String text) {

this.imageIcon = createImage(text);

}

private ImageIcon createImage(String text) {

BufferedImage bi = new BufferedImage(30, 1000, BufferedImage.TYPE_INT_ARGB);

ImageIcon image = new ImageIcon(bi);

Graphics2D g2d = bi.createGraphics();

GradientPaint paint = new GradientPaint(0, 0, Color.yellow, 30, 10, Color.red, true);

g2d.setPaint(paint);

g2d.fillRect(0, 0, bi.getWidth(), bi.getHeight());

AffineTransform at = new AffineTransform();

at.rotate( -Math.PI / 2);

g2d.setTransform(at);

g2d.setColor(Color.white);

g2d.setFont(font);

g2d.drawString(text, -180, bi.getWidth() / 2);

return image;

}

public Insets getInsets() {

Insets insets = (Insets)super.getInsets().clone();

insets.left += imageIcon.getIconWidth();

return insets;

}

public void paint(Graphics g) {

super.paint(g);

if (imageIcon != null) {

Insets insets = getInsets();

g.drawImage(imageIcon.getImage(),

insets.left - imageIcon.getIconWidth(),

insets.top,

null);

}

}

public static void main(String[] args) {

final JFrame frame = new JFrame();

frame.setSize(600, 500);

frame.setTitle("ImageMenu");

final ImageMenu menu = new ImageMenu("Windows XP Perfessional");

menu.add(new JMenuItem("Winzip 8.0"));

menu.addSeparator();

menu.add(new JMenuItem("Programs"));

menu.add(new JMenuItem("Document"));

menu.add(new JMenuItem("Settings"));

menu.add(new JMenuItem("Search"));

menu.add(new JMenuItem("Help and Support"));

menu.add(new JMenuItem("Run..."));

menu.addSeparator();

menu.add(new JMenuItem("Shut Down..."));

JLabel label = new JLabel("Right click me to show image popup menu.");

label.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseReleased(MouseEvent e) {

if (e.isPopupTrigger()) {

menu.show(frame, e.getPoint().x, e.getPoint().y);

}

}

});

frame.getContentPane().add(label, BorderLayout.CENTER);

frame.show();

}

}

同样,采用这种方法,也可以将JMenu扩展出同样的效果

如何美化菜单界面java_用 Java 创建带图像的菜单来美化界面相关推荐

  1. JAVA 创建带个人信息,头像等内容和可变二维码的海报

    文章目录 JAVA 创建带个人信息,头像等内容和可变二维码的海报 1.添加二维码依赖包 2.写画图工具类 3.运行main 方法 4.防止重复创建 JAVA 创建带个人信息,头像等内容和可变二维码的海 ...

  2. 界面编程---用Java创建QQ登录页面

    界面编程: 图形用户界面GUI由文本框,滑块和滚动条等小部件组成,当今的计算机用户都希望其使用的软件有这样的界面.Java类库包含一组被称为Swing的包,使用户提供GUI,并接收来自键盘鼠标和其他输 ...

  3. 微信读书登陆界面java_(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好...

    转载地址:(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 一.环境搭建 相关环境软件:JDK1 ...

  4. 计算器界面网格布局java,安卓案例:网格布局实现计算器界面

    安卓案例:网格布局实现计算器界面 一.网格布局(GridLayout) GridLayout布局使用虚细线将布局划分为行.列和单元格,也支持一个控件在行.列上都有交错排列. (一)继承关系图 (二)常 ...

  5. Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )

    Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...

  6. 用Java创建一个学生成绩管理系统登陆界面(初级)

    目录 任务与要求 代码部分 部分代码: 完整代码: 任务与要求 使用eclipse.exe创建一个登录界面,如图1所示,当用户名输入"lili",密码输入"123456& ...

  7. 微信公众号开发---自定义菜单的创建及菜单事件响应(java)

    微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3 ...

  8. antlr java_使用ANTLR和Java创建外部DSL

    antlr java 在我以前的文章中,有一段时间我写了关于使用Java的内部DSL的文章. 在Martin Fowler撰写的< 领域特定语言 >一书中,他讨论了另一种称为外部DSL的D ...

  9. java 创建用户界面_建立图形用户界面 JAVA实验

    实验 7 建立图形用户界面 一.实验目的 了解图形用户界面基本组件窗口.按钮.文本框.选择框.滚动条等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用 Java 的事件处理机制. 二.实 ...

  10. python建立窗口并美化_Python GUI教程(十六):在PyQt5中美化和装扮图形界面

    在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言.其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式, ...

最新文章

  1. 谢文睿:西瓜书 + 南瓜书 吃瓜系列 6. 神经网络
  2. 【嵌入式】C语言高级编程-container_of宏(04)
  3. mysql单源多表同步单库单表_MySQL主从复制单表或者多表
  4. createSQLQuery与createQuery的区别
  5. php 获取父类名称,[typecho]获取 父级分类 名称?
  6. HDU 5387 Clock(分数类+模拟)
  7. 请君入瓮: 火眼自称遭某 APT 国家黑客组织攻击
  8. 兄弟连学python(4)——Css选择器
  9. 【visio】visio软件安装
  10. navicat 10.1.7 注册码
  11. C++ stl库 手写 源码分析
  12. 力扣刷题 DAY_84 贪心
  13. java socket是什么_socket系列之什么是socket
  14. 码农如何克服“职业病”
  15. WEB——LNMP服务搭建
  16. 4246. 【五校联考6day2】san (Standard IO)
  17. 【易开嵌入式】rt-thread+stm32f407+nandflash,实现RL-FLASHFS文件系统移植
  18. 2021.07.28
  19. myeclipse17创建Web、Maven项目
  20. ATFX:人民银行1年期MLF降息10基点,USDCNH大涨

热门文章

  1. document和document.documentElement的区别
  2. 悼念打dota的日子
  3. 清北学堂2018noip集训D1
  4. qq html 文件,qq怎么传送html文件
  5. 安全系统工程徐志胜电子版_安全系统工程-第3版
  6. 【AIOT】HumanCenteredSensing
  7. Epicor客制化 - 在VS中进行开发
  8. MySQL数据库基础03 韩顺平 自学笔记
  9. 【SpringBoot新手篇】SpringBoot优雅文件上传方式
  10. Modern Robotics:机器人的构型空间