鼠标事件监听机制的三个方面:

1.事件源对象:

  事件源对象就是能够产生动作的对象。在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象。Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象

2.事件监听方法:

  addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作;捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理。

  addActionListener(ActionListener al);捕获类似按钮组件上的鼠标点击动作或者是类似输入框组件上的键盘回车动作;然后将动作以及相关信息交由事件处理类(实现ActionListener接口)的相应方法进行处理。

  addMouseMotionListener(MouseMotionListener mml);捕获鼠标的移动和拖动动作;然后将动作以及相关信息交由事件处理类(实现MouseMotionListener 接口)的相应方法进行处理。

  addKeyListener(KeyListener kl);捕获事件源对象上的键盘按键的按下、释放和敲击动作;然后将动作以及相关信息交由事件处理类(实现KeyListener 接口)的相应方法进行处理。

3.事件接口(事件处理类,也即实现了事件接口的类):

  MouseListener     鼠标事件接口,有按下,释放,点击,进入和离开的事件处理方法

  ActionListener     动作事件接口,有动作对应的事件处理方法

  MouseMotionListener    鼠标移动事件接口,有移动和拖动的事件处理方法

  KeyLisetener       键盘事件接口,有释放,按下和敲击的事件处理方法

了解了事件监听的这三个方面之后,我们要对组件添加事件的监听就很容易了。下面是一个小例子:

目标:创建一个简易的绘图板,可以实现按下相应的功能来达到不同的绘画目的。

分析:   1.首选需要一个画图板的简易界面,定义一个Draw类使用Java的Swing组件进行界面的初始化。

    2.然后定义事件接口DrawListener类,让它实现以上的接口,重写接口中的方法,达到自己的目的。

    3.在Draw中实例化DrawListener类的对象。

    4.为Draw类中的组件添加事件监听方法,指定事件处理类为DrawListener。

代码实现:

Draw类

package com.cbs;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame; /**
* Draw类,用于界面的初始化
*
* @author CBS
*
*/
public class Draw { public static void main(String[] args) {
Draw t = new Draw();
t.showUI(); } // 界面初始化方法
public void showUI() {
JFrame jf = new JFrame();
jf.setTitle("画图");
jf.setSize(, );
jf.setDefaultCloseOperation();
jf.setLocationRelativeTo(null);
FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
jf.setLayout(layout);
JButton drawLine = new JButton("画直线");
jf.add(drawLine);
JButton drawOval = new JButton("画椭圆");
jf.add(drawOval);
JButton drawArc = new JButton("画曲线");
jf.add(drawArc);
JButton drawPolygon = new JButton("三角形");
jf.add(drawPolygon);
JButton jb1 = new JButton();
jb1.setBackground(Color.RED);
jf.add(jb1);
jb1.setPreferredSize(new Dimension(, ));
JButton jb2 = new JButton();
jb2.setBackground(Color.GREEN);
jf.add(jb2);
jb2.setPreferredSize(new Dimension(, )); jf.setVisible(true); Graphics g = jf.getGraphics();// 获取当前的画笔
DrawListener dl = new DrawListener(g);// 实例化DrawListener类的对象
jf.addMouseListener(dl);// 为窗体添加鼠标事件监听方法
jf.addMouseMotionListener(dl);// 为窗体添加鼠标移动事件监听方法 // 为按钮添加动作监听
drawLine.addActionListener(dl);
drawOval.addActionListener(dl);
jb1.addActionListener(dl);
jb2.addActionListener(dl);
drawArc.addActionListener(dl);
drawPolygon.addActionListener(dl); } }

DrawListener类

package com.cbs;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener; import javax.swing.ImageIcon;
import javax.swing.JButton; /**
* 事件处理类
*
* @author CBS
*
*/ public class DrawListener implements MouseListener, MouseMotionListener,
ActionListener { private int x1, y1, x2, y2;// 记录两次鼠标的点击坐标
private Graphics g;// 从界面获取画布对象
private String str;// 记录当前按钮的信息,区分不同的按钮
private Color color;// 记录画笔的颜色信息
private int f = ;// 控制变量,用于更新坐标 public DrawListener(Graphics g) {
this.g = g;
} //鼠标按下时的处理方法
public void mousePressed(MouseEvent e) {
// 记录第一次点击的位置;由对象e得到
if (f == ) {
x1 = e.getX();
y1 = e.getY();
}
} //鼠标点击时的处理方法
public void mouseClicked(MouseEvent e) {
if ("三角形".equals(str)) {
System.out.println("sanjaioxing");
int x, y;
x = e.getX();
y = e.getY();
g.setColor(color);
g.drawLine(x, y, x1, y1);
g.drawLine(x2, y2, x, y);
f = ; } } // 鼠标释放时的处理方法
public void mouseReleased(MouseEvent e) {
// 记录鼠标释放时的坐标
if (f == ) {
x2 = e.getX();
y2 = e.getY();
}
// 两个坐标的得到了,可以用于直线的绘制,调用画布对象g方法,在界面上面画出直线
if ("画直线".equals(str)) {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
}
if ("画椭圆".equals(str)) {
g.setColor(color);
g.drawOval(x1, y1, x2, y2);
}
if ("三角形".equals(str) && f == ) {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
f++;
}
} // 鼠标进入时的处理方法
public void mouseEntered(MouseEvent e) { } // 鼠标退出时的处理方法
public void mouseExited(MouseEvent e) { } public void actionPerformed(ActionEvent e) {
if ("".equals(e.getActionCommand())) {
JButton jb = (JButton) e.getSource();
color = jb.getBackground();
} else {
str = e.getActionCommand();
}
} // 鼠标拖动时的处理方法
public void mouseDragged(MouseEvent e) {
if ("画曲线".equals(str)) {
int x, y;
x = e.getX();
y = e.getY();
g.setColor(color);
g.drawLine(x1, y1, x, y);
x1 = x;
y1 = y;
} } // 鼠标释放时的移动方法
public void mouseMoved(MouseEvent e) { } }

ps:纯属一孔之见,欢迎指正。

Java中的事件监听机制的更多相关文章

  1. Java 中的事件监听机制

    看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...

  2. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  3. 简单剖析Node中的事件监听机制(一)

    使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...

  4. Java界面编程—事件监听机制

    组件首先要先注册事件处理器,当用户单击组件.移动鼠标或者敲击键盘时都会产生事件(Event),一旦有时间发生,应用程序就会做出对该事件的响应,这些组件就是事件源(Event source). 接受.解 ...

  5. 请描述Java中的时间监听机制?

    1.时间监听涉及到三个组件:事件源.事件对象.事件监听器 2.当事件源上发生某个动作时,它会调用事件监听器的一个方法,并将事件对象穿进去,开发人员在监听器中通过事件对象,拿到事件源,从而对事件源进行操 ...

  6. 转:java中的事件监听是怎样实现随时监听的

    http://blog.csdn.net/qq369201191/article/details/51204006

  7. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

  8. JAVA事件监听机制学习

    //事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...

  9. Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

随机推荐

  1. SSO单点登录的研究

    一.单点登录的概述       单点登录(Single Sign On),简称为 SSO,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 用以解决同一公司不同子产 ...

  2. PLSQL 保存布局

    PLSQL 设置好布局,退出重新登录后,页面布局又恢复原样,所以需要我们保存下我们布局 打开window-->Save layout,保存布局,下次登录布局就是你原来的布局了

  3. Windows8.1 + Nvidia cuda8.0 + Vs2015

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Vs2015 1.查看本机配置,查看显卡类型是否支持NVIDIA GPU选中计算机-->右键属性-->设备管理 ...

  4. Linux下关闭JBoss实例

    本文内容: 查看JBoss运行实例 #ps -ef|grep java 上图就是运行结果(部分结果),其中一个服务器上可能会运行多个JBOSS server实例,找到你需要看的那个. 其中 ps -e ...

  5. java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  6. SmartCoder每日站立会议06

    站立会议内容 讨论了小程序的具体实现方式,主要会加入地图这一元素,使程序看起来更加的方便直观,同时也会使人感到新颖.在对各个点的评论对话功能也在考虑中. 1. 站立会议照片: 2.任务展板 3.燃尽图

  7. ArrayList源码解读

    在端午节这个节日里,有一个特殊的任务,我带着你一起揭开"ArrayList"的真面目.从成员变量.构造函数.主要方法三部分,对ArrayList有进一步的认识,希望能够帮助你. 一 ...

  8. Python3.6_x86通过FFpmeg获取视频或音频的时长和分辨率

    前言 前段时间公司在做流媒体服务,与许多厂家合作拿了许多视频过来,现在要对这些视频文件进行整理,通过特殊的编码排列,获取他们的时长以及分辨率,这里我遇到一个大坑,请往下面看. # -*- coding ...

  9. shared_ptr注意点

    1.原始指针不能直接使用赋值运算符对shared_ptr进行赋值运算 std::shared_ptr<int> p; p= ); //error p.reset(); //success ...

  10. sleep()

    sleep() 方法可以使当前线程(即调用该方法的线程)暂停执行一段时间, 让其他线程有机会继续执行, 但它并不释放对象锁: 所以当sleep()方法结束时: 当前线程还是拥有对象锁: 当线程拥有对象 ...