用Java创建带图像的菜单

菜单|创建

在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扩展出同样的效果。

时间: 2024-12-29 23:21:39

用Java创建带图像的菜单的相关文章

用Java创建带图标和缩进的JComboBox

创建 默认的JComboBox无法在每个条目上显示图标.缩进等样式.但是Swing的MVC设计结构为各种组件提供了无与伦比的可扩展性.为了实现这一点,我们可以创建一个新的Renderer来负责每个条目的绘制. 首先我们新写一个类ImagedComboBoxItem,它封装了一个下拉条目的信息,包括图标.文字.缩进等: class ImagedComboBoxItem { private Icon icon = null; private String text = null; private i

JFC/Swing活学活用之创建自定义图像组件

创建 引言 本文将讲述如何应用JFC/Swing内建的图像组件来创建完全自定义的基于图像的用户接口. 大多数Swing应用程序是通过标准VM提供的,或者是客户提供的外观和感觉(L&F)来获取它们的外在展示.L&F是一个完整的体系架构,VM需要做很多内在的工作,并且它还不是完全自定义的.举个例子来说吧,在基于L&F的前提下,我们可以创建一个按钮,看起来有点像交通岗上的"红灯",随之而来的在你的应用中所有的按钮就都有了这样的"相貌".然而有时我们

[译] 如何创建 BubblePicker – Android 多彩菜单动画

本文讲的是[译] 如何创建 BubblePicker – Android 多彩菜单动画, 原文地址:How We Created BubblePicker – a Colorful Menu Animation for Android 原文作者:Irina Galata, Yuliya Serbenenko 译文出自:掘金翻译计划 译者:hackerkevin 校对者:luoqiuyu phxnirvana 如何创建 BubblePicker – Android 多彩菜单动画 我们已经习惯了移动

使用 JavaScript 创建 FrontPage 下拉菜单

frontpage|javascript|菜单|创建|下拉 摘要: 当您在 Internet 上进行浏览时,到处都在使用各种类型的下拉菜单,但如果您曾经尝试创建过一种类型的下拉菜单的话,就会了解此过程可能并非总是非常简单.本文解释了创建您自己的下拉菜单所需的脚本和样式. 下拉菜单简介 Internet 上几乎每个站点都存在某种种类的下拉菜单.您可能会发现,简单的下拉菜单会在网页的上部水平排列,复杂些的会级联子菜单,有些使用带有鼠标停留效果的图形,还有一些在网页的左侧或右侧竖直排列.如果您想过在自

java实现的二级联动菜单效果_java

本文实例讲述了java实现的二级联动菜单效果.分享给大家供大家参考,具体如下: JSP代码: <%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>二级菜单联动演示</title> <script type="text/javascript"> var req; window.onload=f

使用Java发送带附件的附件的示例_java

这里使用的是JavaMail技术,前台使用了fckeditor做邮件美化,由于只是示例,后台发送时只是将邮件保存在本地,但是可以查看,如果需要实际发送,请参考我的其他博客文章,我写了很多关于邮件发送的示例! JSP页面页面除了引用fckeditor外,要注意我们是需要发送附件的: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ ta

Java创建文件且写入内容的方法_java

前两天在项目中因为要通过http请求获取一个比较大的json数据(300KB左右)并且保存,思来想去,最后还是决定将获取到的json数据以文件的形式保存下来,每次使用的时候去读取文件就可以了. 废话不多说了,直接上代码. 以下是代码截图,文章结尾会有完成的代码文件可供下载. 创建文件方法: 写入文件内容方法: 删除文件方法: 测试: 关于文件创建,写入内容,删除.可以根据自己的情况再稍作修改. 以下是代码类. package com.file.run; import java.io.Buffer

Java创建柱状图及饼状图

Java创建图表其实还是很方便的,但是要引入相关的jar包.如下 jfreechart.jar jcommon,jar gnujaxp.jar 其中最主要的是jfreechart.jar. 下面就让我们先看看创建的图标的运行结果吧. 是不是感觉很生动形象,一目了然呢? 下面让我们一一拉进行分析吧首先是柱状图 我已经在代码中做好了注释,可以直接拿过来使用. package mytest; import java.awt.FlowLayout; import java.awt.Font; impor

【java】java自带的java.util.logging.Logger日志功能

偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中 ②logging.properties日志文件内容如下: ############################################################ # Default Logging Configuration File # # You