先在show_plate()函数(方法:顺便提一提,Java的类中只有两个组成1)属性成员 2)方法函数,各种操作都要在函数中进行)建立一个窗体(*容器)JFrame Plate = new JFrame(),用来当所谓的绘图板,基本操作同之前的登陆界面,JFrame类型创建,然后设置大小(setSize()),位置(setLocationRelativeTo()),关闭机制(setDefaultCloseOperation())。
板有了,那么剩下的就是关键的画笔:由于绘制的线条是在用户鼠标按下和松开的过程来完成,所以我们的画笔本质上是一个监听器,鼠标监听器!监听器在之前的登陆界面中有提到过,一般采用重写Java原有接口的方式创建属于自己的监听器(由于接口是abtract抽象类,所以里边的函数要全部重写,不需要用的写成空函数即可)。
这里插入先讲讲这个自定义监听器类(DrawerListener)的实现:由于我们关注的是鼠标按下和松开这两个动作,所以我们需要的接口函数是MousePressed和MouseRelease,其他的为空即可。由于线条位置的确定需要坐标,所以在我们自己创建的DrawerListener中添加坐标属性:sx,sy,ex,ey;同时,由于画线的操作也是在鼠标松开的时候完成,所以我们需要利用Graphics(Java中的一个类)来实现绘线。
- Graphics :在类中创建一个Graphics对象,主要利用setColor,drawLine的绘制线条的函数。
- MousePressed(MouseEvent e) { }: 我们只需要读取坐标,可使用MouseEvent类中的函数getX(),getY()。
- MouseReleased(MouseEvent e) {}: 这里不仅要读取末坐标,还要进行线条的绘制(Graphics对象的函数使用)
1 import java.awt.Color; 2 import java.awt.Graphics; 3 import java.awt.event.MouseEvent; 4 import java.awt.event.MouseListener; 5 import java.awt.event.MouseWheelEvent; 6 7 //画笔监听器 8 public class DrawerListener implements MouseListener { 9 int x1,y1,x2,y2,x3,y3,sx,sy,ex,ey; 10 Graphics graph; //创建画布 11 public void mousePressed(MouseEvent e){ 12 System.out.println("Pressed"); 13 sx = e.getX(); //注意是得到事件源的坐标,鼠标点击为事件源 14 sy = e.getY(); 15 } 16 public void mouseReleased(MouseEvent e){ 17 System.out.println("Released"); 18 ex = e.getX(); 19 ey = e.getY(); 20 //松开时,画图 21 graph.setColor(Color.BLUE); //画笔颜色 22 graph.drawLine(sx, sy, ex, ey); 23 } 24 25 public void mouseClicked(MouseEvent e){} 26 public void mouseEntered(MouseEvent e){} 27 public void mouseExited(MouseEvent e){} 28 29 }画笔监听器
然后再回到我们主体的Drawer类中的show_plate()函数:往窗体里添加一个DrawerListener类,之后在窗体可见之后建立Graphics对象graph,接着获取窗体的画布:graph = Plate.getGraphics(); 接着讲获取的graph赋值给监听器的Pen.graph,因为最终的绘制操作是在监听器中实现的。(其实也可以直接将Plate的画布赋值给Pen.graph,就不创建一个新的对象了)。
1 public class Drawer { 2 public void show_plate() 3 { 4 JFrame Plate = new JFrame(); 5 Plate.setSize(1000,800); 6 Plate.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 7 Plate.setLocationRelativeTo(null); 8 9 //创建画笔监听器 10 DrawerListener Pen = new DrawerListener(); 11 Plate.addMouseListener(Pen); 12 Plate.setVisible(true); 13 //要在容器可见后,才创建画布 14 Pen.graph = Plate.getGraphics(); //注意Graphics 是一个类,获取窗体的画布对象 15 16 } 17 18 public static void main(String[] args){ 19 Drawer drawer = new Drawer(); 20 drawer.show_plate(); 21 } 22 }Drawer
进阶版:其实就是在原来的基础上增加按钮,来实现选择不同绘制图形,不同颜色
参考https://blog.****.net/a784296404/article/details/80150161