java实用教程——组件及事件处理——MouseEvent事件

MouseEvent事件

任何组件上都可以发生鼠标事件,如鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个
事件对象,事件源注册监视器的方法是addMouseListener(MouseListener listener);

➊使用MouseIistener接口处理鼠标事件

使用MouseListener接口可以处理以下5种操作触发的鼠标事件:
在事件源上按下鼠标键。
在事件源上释放鼠标键
在事件源上单击鼠标。
鼠标进入事件源。
鼠标退出事件源。

MouseEvent类中有下列几个重要的方法
getX() 获取鼠标指针在事件源坐标系中的x坐标。

getY()获取鼠标指针在事件源坐标系中的y坐标。

●getModifiers()获取鼠标的左键或右键。鼠标的左键和右键分别使用inputEvent类中的常量BUTTONI MASK和BUTTON3 _MASK来表示
●getClickCount() 获取鼠标被单击的次数。
●getSource() 获取发生鼠标事件的事件源。
MouseListener接口中有如下方法:
●mousePressed(MouseEvent) 负责处理在组件上按下鼠标键触发的鼠标事件。即,当你在事件源按下鼠标键时,监视器调用接口中的这个方法对事件做出处理。
●mouseReleased(MouseEvent) 负责处理在组件上释放鼠标键触发的鼠标事件。即,当你在事件源释放鼠标键时,监视器调用按口中的这个方法对事件做出处理。
●mouseEntered(MouseEvenr) 负责处理鼠标进入组件触发的鼠标事件。即,当鼠标指针进入组件时,监视器调用接口中的这个方法对事件做出处理。
●mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件。即,当鼠标指针离开容器时,监视器调用接口中的这个方法对事件做出处理。
●mouseClicked(MouseEvent)负责处理在组件上单击鼠标键触发的鼠标事件。即,当单击鼠标键时,监视器调用接I口中的这个方法对事件做出处理。

下面的例子10 中,分别监视按钮、文本框和窗口上的鼠标事件,当发生鼠标事件时,获取鼠标指针的坐标值,注意,事件源的坐标系的左上角是原点。


public class Example9_10 {public static void main(String args[]) {WindowMouse win=new WindowMouse();win.setTitle("处理鼠标事件"); win.setBounds(10,10,560,380);}}
import java.awt.*;
import javax.swing.*;
public class WindowMouse extends JFrame {/*** */JButton button;JTextArea area;MousePolice police; WindowMouse() {init();setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }void init() {setLayout(new FlowLayout());area = new JTextArea(10,28);Font font = new Font("宋体",Font.PLAIN,22);area.setFont(font);police = new MousePolice();police.setView(this);//将当前窗口传递给police组合的窗口 button = new JButton("按钮"); button.addMouseListener(police);addMouseListener(police);add(button);add(new JScrollPane(area));}
}
import java.awt.event.*;
import javax.swing.*;
public class MousePolice implements MouseListener {WindowMouse view;public void setView(WindowMouse view) {this.view = view;}public void mousePressed(MouseEvent e) {if(e.getSource() == view.button&&e.getButton() == MouseEvent.BUTTON1) {view.area.append("在按钮上按下鼠标左键:\n");view.area.append(e.getX()+","+e.getY()+"\n");}else if(e.getSource() == view&&e.getButton() == MouseEvent.BUTTON1) {view.area.append("在窗体中按下鼠标左键:\n");view.area.append(e.getX()+","+e.getY()+"\n");}}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e)  {if(e.getSource() instanceof JButton)view.area.append("\n鼠标进入按纽,位置:"+e.getX()+","+e.getY()+"\n");if(e.getSource() instanceof JFrame)view.area.append("\n鼠标进入窗口,位置:"+e.getX()+","+e.getY()+"\n"); }public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {if(e.getClickCount()>=2)view.area.setText("鼠标连击\n");}
}

在这里插入图片描述
❷使用MouseMotionListener接口处理鼠标事件

使用MouseMotionlistener 接口可以处理以下两种操作触发的鼠标事件。

●在事件源上拖动鼠标

●在事件源上移动鼠标

鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent 类自动创建一个事件对象。

事件源注册监视器的方法是addMouseMotionListener(MouseMotionListener listener)。
MouseMotionListener接口中有如下方法,
●mouseDraggedMouseEvent) 负责处理拖动鼠标触发的鼠标事件。即当你拖动鼠标时(不必在事件源上),监视器调用接口中的这个方法对事件做出处理。
●mouseMoved(MouseEvent) 负 责处理移动鼠标触发的鼠标事件。即当你在事件源上移动鼠标时,监视器调用接口中的这个方法对事件做出处理。

可以使用坐标变换来实现组件的拖动。当用鼠标拖动组件时,可以先获取鼠标指针在组/件坐标系中的坐标y,以及组件的左上角在容器坐标系中的坐标a、b:如果在拖动组件时,想让鼠标指针的位置相对于拖动的组件保持静止,那么,组件左上角在容器坐标系中的位置应当是(a+x-x0,a+y-y0)其中x0、y0是最初在组件上按下鼠标时,鼠标指针在组件坐标系中的位置坐标。

下面的例子11使用坐标变换来实现组件的拖动。

public class Example9_11 {public static void main(String args[]) {WindowMove win=new WindowMove();win.setTitle("处理鼠标拖动事件"); win.setBounds(10,10,460,360);}}
import java.awt.*;
import javax.swing.*;
public class WindowMove extends JFrame { LP layeredPane;WindowMove() {layeredPane = new LP();add(layeredPane,BorderLayout.CENTER);setVisible(true);setBounds(12,12,300,300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class LP extends JLayeredPane implements MouseListener,MouseMotionListener {JButton buttonTom,buttonJerry;int x,y,a,b,x0,y0;LP() {buttonTom=new JButton("用鼠标拖动Tom"); buttonTom.addMouseListener(this);buttonTom.addMouseMotionListener(this);buttonJerry=new JButton("用鼠标拖动Jerry"); buttonJerry.addMouseListener(this);buttonJerry.addMouseMotionListener(this);setLayout(new FlowLayout());add(buttonTom,JLayeredPane.DEFAULT_LAYER);//最下层add(buttonJerry,JLayeredPane.DEFAULT_LAYER); }public void mousePressed(MouseEvent e) {JComponent com=null;com=(JComponent)e.getSource(); setLayer(com,JLayeredPane.DRAG_LAYER);//最上层a=com.getBounds().x;b=com.getBounds().y;x0=e.getX();     //获取鼠标在事件源中的位置坐标y0=e.getY();}public void mouseReleased(MouseEvent e) {JComponent com=null;com=(JComponent)e.getSource(); setLayer(com,JLayeredPane.DEFAULT_LAYER);}public void mouseEntered(MouseEvent e)  {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e){}public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e) {Component com=null;if(e.getSource() instanceof Component) {com=(Component)e.getSource(); a=com.getBounds().x;        b=com.getBounds().y;x=e.getX();     //获取鼠标在事件源中的位置坐标y=e.getY();a=a+x;b=b+y;com.setLocation(a-x0,b-y0);}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这个世界,正在悄悄惩罚那些不注意身体的人

这是头哥侃码的第226篇原创上周四,整个网络被 “马拉多纳去世” 的消息刷屏了。虽然我从不看足球,而且没有看过马拉多纳踢球,但关于他的故事、他的传奇、他的丰功伟绩,倒是听过不少。所以在听到这个消息的时候,我感到深…

tcp拥塞控制_网络TCP的拥塞控制算法简介

作为网络中使用最广泛的传输协议,TCP的拥塞控制机制是学术界和工业界关注的焦点问题之。然而,目前广泛使用的TCP传输协议的拥塞控制算法仍然使用相对固定的窗口调节策略,无法根据动态变化的场景自适应地调整参数,从而造成不可避免…

java实用教程——组件及事件处理——对话框(消息对话框,输入对话框,确认对话框)

消息对话框:(这个对话框提供一些信息) 无模式:可多线程的执行 有模式:用户必须处理这个一个对话框。必须解决这个问题后才可以继续相处下去 对话框分为无模式和有模式两种。如果一个对话框 是有模式的对话框,那么当这个对话框处于…

11张图演进SeviceMesh服务网格

本周和大家聊聊架构进化史-大家可文末扫码加入随着互联网持续高歌猛进,相关技术名词也是层出不穷,ServiceMesh服务网格这两年尤为火爆,然而很少有讲清楚的文章。笔者这里用心整理了一篇文章,用11张图演绎ServiceMesh的进化历程&am…

java实用教程——组件及事件处理——对话框(颜色对话框,自定义对话框)

颜色对话框: 可以用javax.swing包中的JColorChooser类的静态方法 public staticColorshowDialog (Component component, String title, Color initialColor) 创建一个有模式的颜色对话框,其中参数component指定颜色对话框可见时的位置,颜色对…

.NET Core/.NET 5.0 析构函数依然有效?

【导读】最近看到小伙伴在.NET Core中用到了析构函数,不禁打一疑问,大部分情况下,即使在.NET Framework中都不会怎么用到析构函数,我想在.NET Core中是否还依然有效呢?随着时间推移,迭代版本更新&#xff0…

java实用教程——常用实用类——String类(字符串类)

JAVA把String类定义为final类(因此用户不能扩展String类,即String类不可以有子类) String对象可以用""进行并置运算 identityHashCode会返回对象的hashCode,而不管对象是否重写了hashCode方法。 public class Example8_1 {public static void…

sqlserver 事务日志 异常增长原因排查_小白入门学习打日志

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y记得之前写过一篇:《阿里巴巴 Java开发手册》读后感,之前自学时由于没怎么接触过打“日志”,所以《手册》中的“日志…

在 k8s 中部署 Prometheus 和 Grafana

部署 Prometheus 和 Grafana 到 k8sIntro上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k8s 中部署的时候就不能在使用前面讲的静态配置的方式来部署了,需要使用 Prometheus 的服务发现。部署规划Pr…

EntityFramework Core 5.0 VS SQLBulkCopy

【导读】EF Core 5.0伴随着.NET 5.0发布已有一段时日,本节我们来预估当大批量新增数据时,大概是多少区间我们应该考虑SQLBulkCopy而不是EF CoreSQLBulkCopy早出现于.NET Framework 2.0,将数据批量写入利用此类毫无疑问最佳,虽其来…

小心使用 Task.Run 续篇

关于前两天发布的文章:为什么要小心使用 Task.Run,对文中演示的示例到底会不会导致内存泄露,给很多人带来了疑惑。这点我必须向大家道歉,是我对导致内存泄漏的原因没描述和解释清楚,也没用实际的示例证实,是…

java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)

1: 相对于窗口的具体位置 关键点: JButton组件添加到JPanel时,如果想自己位置,需要对JPanel进行如下设置,才能自定义按钮位置 需要将组件添加到画板上去,才可以设置组件的相对具体位置 button1.setBounds…

usb接口定义引脚说明_PerfDogService使用说明

令牌申请教程:https://bbs.perfdog.qq.com/article-detail.html?id55安装包下载:https://perfdog.qq.com/sdk一、 概述PerfDog性能狗服务组件,用户可基于service组件二次开发自己PerfDog性能工具或自动化服务。本文档主要对PerfDogService提…

java实用教程——组件及事件处理——布局管理(五种)

1.流式布局FlowLayout public void pack()调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该Window。窗口自动适应大小,使…

个人博客前端模板_腾讯前端开发工程师,教你极速搭建一个个人博客网站

作者: bookerzhao,腾讯 CSIG web前端开发工程师Github 为开源项目提供了用于静态页面展示的 Pages 服务,很多开发者都在上面托管了自己的静态网站和博客,不少开源项目的案例和文档页面也采用了这种方式。不过由于 Pages 的 CDN 节…

云原生时代 给予.NET的机会

.NET诞生于与Java的竞争,微软当年被罚款20亿美元。Java绝不仅仅是一种语言,它是COM的替代者!而COM恰恰是Windows的编程模型。而Java编程很多时候比C编程要容易的多,更致命的是他是跨平台的。微软所推行.NET战略,并且C#…

java实用教程——组件及事件处理——布局的一个小实例

import javax.swing.*; import java.awt.*;public class BasicComponentDemo {Frame frame new Frame("这里测试基本组件");//定义一个按钮Button ok new Button("确认");//定义一个复选框组CheckboxGroup cbg new CheckboxGroup();//定义一个单选框&am…

非极大值抑制_非极大值抑制(non-maximum suppression)

摘自https://blog.csdn.net/qq_38906523/article/details/80195119摘自https://blog.csdn.net/xiexu911/article/details/80609298非极大值抑制NMS在目标检测,定位等领域是一种被广泛使用的方法。对于目标具体位置定位过程,不管是使用sliding Window还是…

TIOBE12月榜单:Java重回第二,Python有望四连冠年度语言

喜欢就关注我们吧!文|白开水TIOBE 公布了 2020 年 12 月的编程语言排行榜。TIOBE 将在下个月公布 2020 年的年度编程语言,一年内排名率增长最高的编程语言将获得这一称号。目前,Python 以 1.90% 数据遥遥领先。其次分别是 C(0.71%…

excel怎么在柱状图上加超链_如何让你的年终总结更符合领导心意,高薪员工必备的excel技能...

临近年底了,好多人都在写年终总结了,惯有的模式就是写一写这一年都做了哪些工作,有什么成绩,未来将如何完善等等......但是如何反应自己一年以来的成绩呢,如果单单是以文字的形式表述怕是不能让领导满意,甚…