详谈Java中的事件监听机制

下面小妖就为大家带来一篇详谈Java中的事件监听机制。小妖觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小妖过来看看吧

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

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类

```java
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(700, 700);
jf.setDefaultCloseOperation(3);
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(30, 30));
JButton jb2 = new JButton();
jb2.setBackground(Color.GREEN);
jf.add(jb2);
jb2.setPreferredSize(new Dimension(30, 30));
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类
```java
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 = 1;// 控制变量,用于更新坐标
public DrawListener(Graphics g) {
this.g = g;
}
//鼠标按下时的处理方法
public void mousePressed(MouseEvent e) {
// 记录第一次点击的位置;由对象e得到
if (f == 1) {
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 = 1;
}
}
// 鼠标释放时的处理方法
public void mouseReleased(MouseEvent e) {
// 记录鼠标释放时的坐标
if (f == 1) {
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 == 1) {
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) {
}
}
```