鼠标监听事件
小目标:
使用鼠标监听事件要完成使用鼠标画画
-
如何添加鼠标监听器:
addMouseListener();
- 鼠标监听器可以加到窗口上,也可以加到按钮上,具体我们要完成哪个功能我们就加到不同的目标上
这里我们来完成通过鼠标画画的程序,这里我们只是用鼠标点一下会出现一个点
- 我们通过这个程序来理解鼠标监听
package com.ffyc.javaoop.图形界面练习;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
import java.awt.event.MouseEvent;
import java.util.Iterator;
public class MyFrame extends Frame {
/*
首先我们如果要使用鼠标监听来画图,这个时候我们就要记录这个鼠标每一次点击的位置,这个时候我们就要将这鼠标点击的位置记录下来
这里我们就是通过一个集合来存储的这个点(我们通过ArrayList来存储,因为ArrayList是有序的,
我们先进入集合的点就可以先被描绘出来)
*/
ArrayList points;
/*
那么我们画图也肯定是需要画笔,这个时候这个时候我们的MyFrame其实就是一个画笔类,这个时候我们要提供一个构造方法来创建这个窗口对象
我们要在这个构造方法中来设置好这个窗口的一些属性
比如:我们要设置这个窗口的大小,要设置这个窗口的颜色,还要设置好这个窗口为可见状态
*/
public MyFrame(String title){
super(title);
this.setSize(400,400);
points = new ArrayList();
this.setVisible(true);
this.addMouseListener(new MyMouseListener());
}
/*
我们每一次点击鼠标之后都要添加一个点到界面上
我们就要设计一个方法,这个方法将我们鼠标点击的点添加我们创建的ArrayList集合中
*/
public void addPoint(Point point){
points.add(point);
}
/*
我们前面在窗口上加了鼠标监听,这个时候我们的鼠标点击窗口之后就会触发时间,这个时候我们就要重写这个鼠标监听接口中的指定方法
来做到我们的鼠标事件一旦产生之后我们就会捕捉到,并且我们捕捉到这个鼠标监听时间之后我们还必须要做出一个指定的操作
*/
private class MyMouseListener extends MouseAdapter{
public void mouseClicked(MouseEvent e){
MyFrame myFrame = (MyFrame)e.getSource();
myFrame.addPoint(new Point(e.getX(),e.getY()));
/*
这个方法就是让画笔重新画一次,因为我们的画笔只可以启动一次,但是这个时候我们想要这个画笔要我们每次点击这个界面的时候都工作一次
这个时候我们就要在鼠标监听器中重写方法中来使用repaint()方法,就是每触发一次这个鼠标事件我们的画笔就会重新启动一次
*/
myFrame.repaint();
}
}
/*
这里我们要重写画笔,这个时候要求我们的画笔要绘制一个小点,其实也就是绘制一个实心圆,只不过这个原的直径要小一些
*/
public void paint(Graphics g){
Iterator iterator = points.iterator();
while(iterator.hasNext()){
Point point = (Point)iterator.next();
g.setColor(Color.pink);
g.fillOval(point.x,point.y,10,10);
}
}
/*
测试程序
*/
public static void main(String[] args) {
new MyFrame("无敌画图工具");
}
}
在了解了这个程序之后我们要来讲一个适配器模式
适配器模式:
- 注意:我们的MyMouseListener类并没有去实现MouseListener接口,而是继承了一个抽象类,这个抽象类的名字是MouseAdapter(翻译过来就是鼠标适配器)
那么我们为什么要继承这个MouseAdapter抽象类而不是去实现MouseListener接口?
- 因为如果我们实现了一个接口,这个时候我们就要将这个接口中所有的抽象方法全部都去实现
- 而在我们的鼠标监听器接口(MouseListener接口)中其实我们定义了五种不同的鼠标事件触发状态,而我们实际编程中又不一定是这五种不同的鼠标触发状态下都要去做一些操作,所以也就是有的抽象方法我们可能就使用不到,这个时候我们也就没有必要去实现这个抽象方法了,所以我们就提出了适配器模式
- 适配器模式其实就是在我们的实现类和接口之间的一个抽象类,这个抽象类中已经将我们的这个接口中的抽象方法全部实现了,只是有方法体,但方法体是空的,里面什么都没有,但是这个时候如果我们有一个类要去继承这个抽象类,这个时候我们就不用重写这个接口中的全部抽象方法,这个时候我们就是使用到哪个方法就重写哪个方法
- 而在我们的鼠标监听器接口(MouseListener接口)中其实我们定义了五种不同的鼠标事件触发状态,而我们实际编程中又不一定是这五种不同的鼠标触发状态下都要去做一些操作,所以也就是有的抽象方法我们可能就使用不到,这个时候我们也就没有必要去实现这个抽象方法了,所以我们就提出了适配器模式
补充:
鼠标有五种触发时间的状态,我们的鼠标监视器接口中定义了对应五种状态的方法
-
鼠标点击状态
public void mouseClicked(MouseEvent e);
-
鼠标按下状态
public void mousePressed(MouseEvent e);
-
鼠标释放状态
public void mouseReleased(MouseEvent e);
-
鼠标移入状态
public void mouseEntered(MouseEvent e);
-
鼠标移出状态
public void mouseExited(MouseEvent e);