java 菜单监听_java 菜单演示

本文演示了如何在 Java 中创建菜单、设置快捷键以及添加图标。通过实例展示了菜单项、子菜单、单选按钮菜单项和复选框菜单项的创建和监听。还介绍了如何为菜单项绑定键盘快捷键,并提供了弹出菜单的实现。
摘要由CSDN通过智能技术生成

package test19;

import java.awt.*;

import java.awt.event.*;

import javax.swing.JPopupMenu;

import javax.swing.JMenu;

import javax.swing.JMenuItem;

import javax.swing.JCheckBoxMenuItem;

import javax.swing.JRadioButtonMenuItem;

import javax.swing.ButtonGroup;

import javax.swing.JMenuBar;

import javax.swing.KeyStroke;

import javax.swing.ImageIcon;

import javax.swing.JPanel;

import javax.swing.JTextArea;

import javax.swing.JScrollPane;

import javax.swing.JFrame;

/**

* Title: 菜单演示

* Description: 演示菜单的建立和快捷键的使用。

* Filename: MenuDemo.java

*/

public class MenuDemo implements ActionListener, ItemListener{

JTextArea output;

JScrollPane scrollPane;

String newline = "\n";

/**

*方法说明:组建菜单栏

*输入参数:

*返回类型:

*/

public JMenuBar createMenuBar(){

JMenuBar menuBar;

JMenu menu, submenu;

JMenuItem menuItem;

JRadioButtonMenuItem rbMenuItem;

JCheckBoxMenuItem cbMenuItem;

//定义菜单条

menuBar = new JMenuBar();

//定义第一个菜单

menu = new JMenu("(A)菜单");

menu.setMnemonic(KeyEvent.VK_A);

menuBar.add(menu);

//下面开始定义菜单项

//只有文字

menuItem = new JMenuItem("(O)只有文本的菜单",

KeyEvent.VK_O);

//设置快捷键

menuItem.setAccelerator(KeyStroke.getKeyStroke(

KeyEvent.VK_1, ActionEvent.ALT_MASK));

//添加监听

menuItem.addActionListener(this);

menu.add(menuItem);

//有图标还有文字

ImageIcon icon = createImageIcon("images/middle.gif");

menuItem = new JMenuItem("(B)有图标和文字的菜单", icon);

menuItem.setMnemonic(KeyEvent.VK_B);

menuItem.addActionListener(this);

menu.add(menuItem);

//只有图标

menuItem = new JMenuItem(icon);

menuItem.setMnemonic(KeyEvent.VK_D);

menuItem.addActionListener(this);

menu.add(menuItem);

//定义一组radio button(单选按钮)菜单

menu.addSeparator();

ButtonGroup group = new ButtonGroup();

rbMenuItem = new JRadioButtonMenuItem("(R)使用radio的菜单");

rbMenuItem.setSelected(true);

rbMenuItem.setMnemonic(KeyEvent.VK_R);

group.add(rbMenuItem);

rbMenuItem.addActionListener(this);

menu.add(rbMenuItem);

rbMenuItem = new JRadioButtonMenuItem("(d)另外一个radio菜单");

rbMenuItem.setMnemonic(KeyEvent.VK_D);

group.add(rbMenuItem);

rbMenuItem.addActionListener(this);

menu.add(rbMenuItem);

//定义一组check box(检查盒)菜单

menu.addSeparator();

cbMenuItem = new JCheckBoxMenuItem("(C)使用检查盒的菜单");

cbMenuItem.setMnemonic(KeyEvent.VK_C);

cbMenuItem.addItemListener(this);

menu.add(cbMenuItem);

cbMenuItem = new JCheckBoxMenuItem("(H)另外一个检查盒");

cbMenuItem.setMnemonic(KeyEvent.VK_H);

cbMenuItem.addItemListener(this);

menu.add(cbMenuItem);

//定义一个带子菜单

menu.addSeparator();

submenu = new JMenu("(S)带有子菜单");

submenu.setMnemonic(KeyEvent.VK_S);

//定义子菜单

menuItem = new JMenuItem("这是子菜单");

//定义快捷键

menuItem.setAccelerator(KeyStroke.getKeyStroke(

KeyEvent.VK_2, ActionEvent.ALT_MASK));

menuItem.addActionListener(this);

submenu.add(menuItem);

menuItem = new JMenuItem("子菜单项");

menuItem.addActionListener(this);

submenu.add(menuItem);

menu.add(submenu);

//定义第二个菜单

menu = new JMenu("(N)第二个菜单");

menu.setMnemonic(KeyEvent.VK_N);

menuBar.add(menu);

return menuBar;

}

/**

*方法说明:构建面板

*输入参数:

*返回类型:

*/

public Container createContentPane(){

//构造一个面板

JPanel contentPane = new JPanel(new BorderLayout());

contentPane.setOpaque(true);

//定义一个文本域

output = new JTextArea(5, 30);

output.setEditable(false);

scrollPane = new JScrollPane(output);

//将文本域添加到面板中

contentPane.add(scrollPane, BorderLayout.CENTER);

return contentPane;

}

/**

*方法说明:构建弹出菜单

*输入参数:

*返回类型:

*/

public void createPopupMenu(){

JMenuItem menuItem;

//构件弹出菜单

JPopupMenu popup = new JPopupMenu();

ImageIcon openicon = createImageIcon("images/Open16.gif");

menuItem = new JMenuItem("打开文件",openicon);

menuItem.addActionListener(this);

popup.add(menuItem);

ImageIcon saveicon = createImageIcon("images/Save16.gif");

menuItem = new JMenuItem("保存文件",saveicon);

menuItem.addActionListener(this);

popup.add(menuItem);

//添加一个监听给文本域,以便点击右键时响应

MouseListener popupListener = new PopupListener(popup);

output.addMouseListener(popupListener);

}

/**

*方法说明:监听普通的菜单选择

*输入参数:ActionEvent e 事件

*返回类型:

*/

public void actionPerformed(ActionEvent e){

JMenuItem source = (JMenuItem)(e.getSource());

String s = "监测事件。"

+ newline

+ " 事件源: " + source.getText()

+ " (选择对象" + getClassName(source) + ")";

output.append(s + newline);

}

/**

*方法说明:监听检查盒菜单选择项

*输入参数:ItemEvent e 检查盒触发的事件

*返回类型:

*/

public void itemStateChanged(ItemEvent e){

JMenuItem source = (JMenuItem)(e.getSource());

String s = "菜单项监听"

+ newline

+ " 事件源: " + source.getText()

+ " (选择对象 " + getClassName(source) + ")"

+ newline

+ " 新的状态: "

+ ((e.getStateChange() == ItemEvent.SELECTED) ?

"选择":"不选择");

output.append(s + newline);

}

/**

*方法说明:获得类的名字

*输入参数:

*返回类型:

*/

protected String getClassName(Object o){

String classString = o.getClass().getName();

int dotIndex = classString.lastIndexOf(".");

return classString.substring(dotIndex+1);

}

/**

*方法说明:根据路径查找图片

*输入参数:String path 图片的路径

*返回类型:ImageIcon 图片对象

*/

protected static ImageIcon createImageIcon(String path){

java.net.URL imgURL = MenuDemo.class.getResource(path);

if (imgURL != null) {

return new ImageIcon(imgURL);

} else {

System.err.println("Couldn't find file: " + path);

return null;

}

}

public static void main(String[] args){

JFrame.setDefaultLookAndFeelDecorated(true);

//创建一个窗体

JFrame frame = new JFrame("MenuDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//创建菜单,并添加到面板中

MenuDemo demo = new MenuDemo();

frame.setJMenuBar(demo.createMenuBar());

frame.setContentPane(demo.createContentPane());

//生成弹出菜单

demo.createPopupMenu();

//显示窗体

frame.setSize(450, 260);

frame.setVisible(true);

}

//弹出菜单监听类

class PopupListener extends MouseAdapter{

JPopupMenu popup;

PopupListener(JPopupMenu popupMenu) {

popup = popupMenu;

}

public void mousePressed(MouseEvent e){

maybeShowPopup(e);

}

public void mouseReleased(MouseEvent e){

maybeShowPopup(e);

}

private void maybeShowPopup(MouseEvent e){

if (e.isPopupTrigger()) {

popup.show(e.getComponent(),

e.getX(), e.getY());

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值