Swing绘制带图片的JMenuItem

本文介绍如何在Java Swing中自定义JMenuItem类以实现带图片的菜单选项。通过继承JMenuItem并覆盖paint方法绘制图片,同时调整getInsets方法以适配图标和文字布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多软件中,为了给用户更好的界面,很多时候在菜单栏的菜单选项都要添加图片,但在JAVA默认的JDK中的JMenuItem无法实现该功能,所以我们要继承这个类,并实现这个功能,下面我将给出详细的代码,和运行结果
 
我们先创建一个类ImageMenu来继承JMenuItem
 
代码如下:
 
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import javax.swing.JMenuItem;

public class ImageMenu extends JMenuItem
{
 private Image image = null;
 
 public ImageMenu(String title,Image image)
 {
  super(title);//调用父类设置选项文本
  this.image = image;
 }
 
 public Insets getInsets()
 {
  Insets insets = (Insets)super.getInsets().clone();
  
  //在左边留出和文字图片宽度一样的距离
  insets.left += image.getWidth(null);
  return insets;
 }
 
 public void paint(Graphics g)
 {
  super.paint(g);
  if(image != null)
  {
   Insets insers = getInsets();
   g.drawImage(image, 0, 0, null);
  }
 }
}
 
下面写一个测试函数来看看结果
 
代码如下
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import com.jtattoo.plaf.aluminium.AluminiumLookAndFeel;

public class text 
{
 static JFrame frame;
 
 public static void main(String[] args) 
 {
  try
  {
   UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
   SwingUtilities.updateComponentTreeUI(frame); 
  }catch(Exception e){}
  frame = new JFrame("带图片的菜单");
  JMenuBar jmb = new JMenuBar();
  JMenu menu = new JMenu("文件");
  JMenu menu2 = new JMenu("编辑");
  
  frame.setSize(300,200);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  ImageMenu im1 = new ImageMenu("打开",new ImageIcon("3.png").getImage());
  ImageMenu im2 = new ImageMenu("保存",new ImageIcon("2.png").getImage());
  ImageMenu im3 = new ImageMenu("刷新",new ImageIcon("1.png").getImage());
  
  jmb.add(menu);
  jmb.add(menu2);
  
  menu.add(im1);
  menu.add(im2);
  menu.add(im3);
  
  frame.setJMenuBar(jmb);
  frame.setVisible(true);
 }
}
 
运行结果如下:
 
实现了图片和文字一体!!!

记事本各个功能都有,与电脑自笔记本一模一样,里面是完整的代码,能够运行void init(){ //建立一个菜单 menubar=new JMenuBar(); //建立文件菜单项 menu=new JMenu("文件(F)"); menubar.add(menu); setJMenuBar(menubar); itemNew=new JMenuItem("新建",new ImageIcon("images//a.gif")); itemOpen=new JMenuItem("打开"); itemSave=new JMenuItem("保存"); itemSaveAs=new JMenuItem("另存为"); itemPage=new JMenuItem("页面设置"); itemPrint=new JMenuItem("打印 "); itemExit=new JMenuItem("退出"); menu.add(itemNew); menu.add(itemOpen); menu.add(itemSave); menu.add(itemSaveAs); menu.add(itemPage); menu.add(itemPrint); menu.add(itemExit); itemNew.addActionListener(this); itemNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK)); itemOpen.addActionListener(this); itemOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK)); itemSave.addActionListener(this); itemSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); itemSaveAs.addActionListener(this); itemPage.addActionListener(this); itemPrint.addActionListener(this); itemPrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK)); itemExit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(lblStatus.getText().equals("已修改")){ int confirm=JOptionPane.showConfirmDialog(null, "文件已修改,要保存吗?"); if(confirm==JOptionPane.OK_OPTION) save(); else if(confirm==JOptionPane.CANCEL_OPTION) return; else if(confirm==JOptionPane.CLOSED_OPTION) return; } System.exit(0); } }); itemExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值