GUI(鼠标监听事件、模拟画图工具)
目的:测试鼠标监听(只测试鼠标点击)
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; //启动类 public class main { public static void main(String[] args) { new MyFrame("画图"); } } //窗体类 class MyFrame extends Frame{ //因为其他地方也可能用到存储,所以我们设置为成员变量,这样的话,这个类的所有地方都是可以用到这个属性 ArrayList points; //画画需要画笔,需要监听鼠标,需要集合来存储这个鼠标的点 public MyFrame(String title){ super(title);//当其他类创建这个类的对象时,可以在构造器中添加名字 setBounds(200,200,400,300);//设置窗体的大小 //存储鼠标点击的点 points=new ArrayList<>(); //显示窗口 setVisible(true); //鼠标监听器,要正对这个窗体,因为我们要正这个窗口里点里鼠标 this.addMouseListener(new MyMouseListener());//监听MyMouseListener类 } //创建画笔方法,能把鼠标点击出来存储在points中的内容画出来 @Override public void paint(Graphics g) { //需要画画,所以要监听鼠标事件 //用迭代器,把集合的内容取出来 Iterator iner=points.iterator();//获取迭代器 //用while循环把里面的东西取出来 while(iner.hasNext()){//如果inerator存在一个点,那我们要把他画下来,并把指针指向下一位,hasNext:是否还有下一个输入项 Point point=(Point)iner.next();//next:下一位,并且会返回一个当前的点,point:当前鼠标 g.setColor(Color.BLUE);//设置颜色 g.fillOval(point.x,point.y,10,10);//画一个圆,但是画在那呢,画在当前鼠标的x,y的位置上,那当前鼠标 } } //添加一个点到界面上,把points的内容画到界面(画板)上,通过中间商(Point point参数)把new Point(e.getX(),e.getY())这个点放到paint(Craphics g)方法中去 public void addPaint(Point point){ //点从MyMouseListener传过来放到集合里通过迭代器画出去 points.add(point);//把当前的点传到oints=new ArrayList<>();集合中,这样我们这paint(Craphics g)、MyMouseListener类、addPaint(Point point)三个地方,就能关联起来了 } //创建用于鼠标监听的内部类,正常情况下,我们是要继承MouseListener接口的,但是继承这个的话我要重写这个接口的全部方法,所以我们就只继承他的子类就可以了,因为他的子类(MouseAdapter)已经重写了接口的全部方法民 private class MyMouseListener extends MouseAdapter{ //需要的鼠标方法有按下、弹起、按住不放,当按住会产生,那这些点就会存在paint(Craphics g)方法中 public void mousePressed(MouseEvent e){//鼠标的按下方法 MyFrame myFrame=(MyFrame)e.getSource();//因为我们是用MyFrame窗体类调用他的,所以要把强转,这样我们就拿到这个窗口了 //这里我们点击的时候就会在界面上产生一个点。 //这个是用来产生点的地,那这个点也就是鼠标的点,怎么获取鼠标,MouserEvent e:相当于当前的鼠标 myFrame.addPaint(new Point(e.getX(),e.getY()));//getX:x的坐标,gety:y的坐标,所以当鼠标点击的时候,我们会把当前鼠标点击的位置存储到集合,那集合的内容可以叫做,鼠标产生的点,也可以叫鼠标点击的位置 //每次点击鼠标都需要重画一遍,如果不设置这个重画的话,那他只会画一次,但是我们画画都是连续性的,所以如果不重画的话,他不会显示什么内容的 myFrame.repaint();//repaint:刷新页面 } } }
图片思路: