java-swing-事件监听-MouseEvent-右键弹出菜单

这篇文章对 MouseEvent 想说的主要是关于鼠标右键弹出菜单的一些体会

关于MouseEvent的一些信息
事件名称:MouseEvent
事件监听接口:MouseListener
需要注意的是,这个接口有五个方法,分别响应
1.按下
2.释放
3.单击(按下后释放)
4.进入(控件区域)
5.离开(控件区域)
这五个动作,五个方法分别是:

public void mouseReleased(MouseEvent e);//鼠标按键被释放是被触发
 
public void mousePressed(MouseEvent e);//鼠标按键被按下时被触发
 
public void mouseExited(MouseEvent e);//光标移除组件时被触发
 
public void mouseEntered(MouseEvent e);//光标移入组件时被触发
 
public void mouseClicked(MouseEvent e);//发生单击事件时被触

另外,与其相似的还有一个抽象类MouseAdapter类,因为MouseListener里面有这么些方法,而这些方法不一定都是我们所需要的,所以引入MouseAdapter抽象类(是类,不是接口,所以在创建监听者时,用的是extends关键字),里面有系统写好的方法(这些方法没有方法体,就是空方法),只用重写需要的方法就行了。

常用方法:

方法名称说明
getSource()用来获得触发组件,返还Object对象
getButton()获取按下,释放,单击的 int 值
getClickCount()获取单击按键的次数

如果要知道鼠标的操作(左键,滚轮,右键),可以通过静态常量判断由 getButton() 方法返回的 int 型值代表的键来获取:

静态常量常量值代表的键
BUTTON11鼠标左键
BUTTON22鼠标滚轮
BUTTON33鼠标右键

对于右键弹出菜单的实现,MouseEvent里有这么一个方法,isPopupTrigger(),它的原型是这样的:

public boolean ispopuptrigger()

它返回此鼠标事件是否为该平台(比如windows平台)的弹出菜单触发事件。说简单点就是用来判断是否应该弹出右键菜单。
这个函数的存在,是由于不同的平台弹出菜单的方式往往不同,但是又为了实现它的跨平台性,所以干脆不管平台是什么方式弹出,只判断是否是是弹出动作。

下面尝试实现右键单击弹出菜单:

需要导入的类:

import java.awt.event.MouseEvent;  //鼠标事件
import java.awt.event.MouseListener;
import javax.swing.JPopupMenu;  //弹出式菜单
import javax.swing.JMenuItem;  //这是 菜单项类

基本步骤
1.创建一个弹出式菜单,并加入一个菜单项

JPopupMenu jpopupmenu1 = new JPopupMenu();   //弹出式菜单
JMenuItem jmenuitem1 = new JMenuItem("菜单");  //菜单项
jpopupmenu1.add(jmenuitem1);   //弹出式菜单添加一个菜单项

2.创建鼠标监听者,实现MouseListener接口,并重写里面的五个类。

class mouselistener implements MouseListener
{
	JPopupMenu jpopupmenu2;  //一个弹出式菜单对象
	mouselistener(JPopupMenu jpopupmenu) //构造方法,将弹出式菜单传进来
	{
		jpopupmenu2 = jpopupmenu;
	}
	//一自己写一个显示的方法
	public void display(MouseEvent e)
	{
		if(e.isPopupTrigger()) //判断是否是弹出菜单动作
		{
			jpopupmenu2.show(e.getComponent(), e.getX(),e.getY())
			//这是JPopupMenu类里的显示方法
			//第一个参数是事件源,后两个是要显示的弹出菜单的左上角坐标
			//MouseEvent中的三个方法,getComponent()是获取响应控件
			//getX(),e.getY()是获取鼠标横纵坐标
		}
	}
	//然后是重写五个方法,不过不用每个方法里都添加display方法,对于我使用的
	//win7系统(),isPopupTrigger()判断为true的是mouseReleased方法,所以
	//只需要在mouseReleased方法添加display就好了,其他四个方法都为空。
	public void mouseReleased(MouseEvent e)
	{
		this.display(e);
	}
	public void mousePressed(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseClicked(MouseEvent e){}
}

4.由于是在窗口内弹出,让JFrame类的窗口对象添加鼠标监听者

JFrame jframe = new JFrame("弹出式菜单");//窗口
jframe.addMouseListener(new mouselistener(jpopupmenu1));  //是主窗口响应鼠标事件

下面是完整的代码:

public class view
{
	public static void main(String[] args) 
	{
		JFrame jframe = new JFrame("弹出式菜单");//窗口
		jframe.setBounds(250, 300, 300, 250);
		
		JPopupMenu jpopupmenu1 = new JPopupMenu();   //弹出式菜单
		
		JMenuItem jmenuitem1 = new JMenuItem("菜单");
		jpopupmenu1.add(jmenuitem1);   //弹出式菜单添加一个菜单项
		
		class mouselistener implements MouseListener
		{
			JPopupMenu jpopupmenu2;  //一个弹出式菜单对象
			mouselistener(JPopupMenu jpopupmenu)   //构造函数
			{
				jpopupmenu2 = jpopupmenu;
			}
			//自己写的一个显示的方法
			public void display(MouseEvent e)
			{
				if(e.isPopupTrigger())
				{
					jpopupmenu2.show(e.getComponent(), e.getX(),e.getY());
				}
			}
			public void mouseReleased(MouseEvent e)
			{
				this.display(e);
			}
			public void mousePressed(MouseEvent e){}
			public void mouseExited(MouseEvent e){}
			public void mouseEntered(MouseEvent e){}
			public void mouseClicked(MouseEvent e){}
		}
		
		jframe.addMouseListener(new mouselistener(jpopupmenu1));  //是主窗口响应鼠标事件
		
		
		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭时操作
		jframe.setVisible(true);   //设置可见
	}
}

最后的弹出式菜单运行结果:
在这里插入图片描述

参考链接:
https://blog.csdn.net/qq_36761831/article/details/81564119
https://blog.csdn.net/zouyang2014/article/details/62418435
https://blog.csdn.net/lirx_tech/article/details/50822307
http://www.169it.com/article/1265254395042505837.html
https://blog.csdn.net/u010142437/article/details/8915975
https://wenda.so.com/q/1363371411060083?src=140

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值