/*
时间:2015年3月21日19:30:25
目的:使用鼠标的事件来画图。
首先看这个程序的结构中,在主函数main中调用了构造函数创建MyFrame类的对象
在MyFrame类中,声明了成员变量ArrayList类型,points
构造方法中创建了带有title名称的窗体,初始化成员变量points,增加鼠标移动事件监听器
布局设置为空,设置位置和大小,设置可见
在类中定义了paint方法绘制组件
paint声明如下:
public void paint(Graphics g);
应该绘制组件的内容时调用此方法;
例如首次显示组件或者组件已损坏并需要修复时。
Graphics 参数中的剪贴区矩形设置为需要绘制的区域。
重写此方法的 Component 子类不需要调用 super.paint(g)。
出于性能的考虑,首次显示宽度或高度为 0 的 Component 时
认为它不需要进行绘制,并且也不需要修复。
还有一个方法是添加点的方法。
自定义监听器类实现了MouseMotionListener,并且实现了其中的
public void mouseDragged(MouseEvent e);
鼠标进入组件按下并拖动时调用该方法。
当然也需要实现
public void mouseMoved(MouseEvent e);
原因也很简单,这是因为实现了一个接口,就要实现该接口中所有的方法,尽管你可以不给出该方法的具体实现,你也要写一个具有空的方法体的对应方法放在哪里,这便是接口,也就是规范的力量。但正如MouseListener接口而言,它一下就有五个方法,在我们只需要实现其中一两个方法时,难道我们就只能听天由命的把所有其他根本不需要的方法也罗列上去吗?并不是这样,这也就引出了适配器的概念。请看下一个博文。
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;//容器类相关的东西在util包内
public class TestMouseMotion {
public static void main(String[] args) {
new MyFrame("Drawing...");
}
}
class MyFrame extends Frame {
ArrayList points = null;
public MyFrame(String title) {
super(title);
points = new ArrayList();
addMouseMotionListener(new MotionListener());
setLayout(null);
setBounds(400, 500, 500, 400);
setVisible(true);
}
public void paint(Graphics g) {
Iterator it = points.iterator();
while(it.hasNext()) {
Color c = g.getColor();
Point p = (Point)it.next();
g.setColor(new Color(204, 204, 255));
g.fillOval(p.x, p.y, 10, 10);
g.setColor(c);
}
}
public void addPoint(Point p) {
points.add(p);
}
}
class MotionListener implements MouseMotionListener {
private int num = 0;
//鼠标按键在组件上按下并拖动时调用
public void mouseDragged(MouseEvent e) {
MyFrame mf = (MyFrame)e.getSource();
mf.addPoint(new Point(e.getX(), e.getY()));
if (num++ > 10) {
mf.repaint();
num = 0;
}
}
//鼠标进入组件但是无按键按下时调用
public void mouseMoved(MouseEvent e) {
}
}