Java绘图项目详解
概述本文以 Java Swing 简易绘图工具项目为实战案例讲解 Java 接口实现、多接口同时实现、鼠标事件监听、动作事件监听、图形绘制、引用传递、全局成员变量核心概念。通过搭建绘图窗体绑定直线 / 矩形 / 等腰三角形 / 清空按钮给按钮绑定动作监听器监听鼠标按下、松开坐标利用Graphics画笔完成图形绘制实现鼠标拖拽绘图完整演示 Swing 多类型监听器、图形绘制的开发流程。一、核心概念区分接口 implements• 语法public class 类名 implements 接口1,接口2一个类可以同时实现多个接口• 强制要求实现接口后必须重写接口里面所有抽象方法少写一个就编译报错本例DrawListener implements MouseListener,ActionListener同时实现鼠标监听器 按钮动作监听器• 接口里的方法默认是 public abstract重写时访问权限不能缩小成员变量全局变量写在类里面、方法外面的变量整个类所有方法都可以访问。publicGraphicsgr;publicintx1,y1,x2,y2;publicStringDrawname;重点局部变量方法内定义只能当前方法使用全局变量可以跨方法传值。这里x1,y1在mousePressed拿到鼠标按下坐标mouseReleased里可以直接读取使用。3. 事件监听分类ActionListener 动作监听器按钮点击事件只需要重写 1 个方法public void actionPerformed(ActionEvent e)• e.getActionCommand()获取按钮上显示的文字用来判断点击了哪个按钮MouseListener 鼠标监听器一共有 5 个抽象方法5 个全部必须重写即使方法体为空◦ mouseClicked鼠标单击◦ mousePressed鼠标按下◦ mouseReleased鼠标松开绘图逻辑写在这里◦ mouseEntered鼠标进入组件◦ mouseExited鼠标离开组件Graphics 画笔绘图 API• gr.drawLine(x1,y1,x2,y2)画直线起点 (x1,y1)终点 (x2,y2)• gr.drawRect(x,y,width,height)画矩形x,y 是左上角坐标宽、高• gr.drawPolygon(x数组,y数组,顶点数量)多边形传入 x 坐标数组、y 坐标数组、顶点个数• gr.clearRect(x,y,width,height)清空指定矩形区域画布实现清空画布功能Math 工具类方法• Math.abs()取绝对值解决绘图时终点坐标小于起点宽高变成负数的问题• Math.min()获取两个数较小值得到图形左上角坐标• Math.max()获取两个数较大值引用传递将画笔对象Graphics传递给监听器监听器中保存画笔引用后续在鼠标事件方法里直接调用画笔绘图。引用类型传递传递的是对象地址多个变量指向同一个对象。二、项目完整代码包名zsy.op0912一共两个文件DrawUI.java界面、DrawListener.java监听器DrawUI.javapackagezsy.op0912;importjavax.swing.*;importjava.awt.*;/** * author SIYU * date 2026/9/19 19:30 * description 绘图界面UI类创建窗体、按钮、画布绑定监听器 */publicclassDrawUI{publicvoidshowUI(){// 创建窗体JFramejfnewJFrame();jf.setSize(800,700);jf.setTitle(简易绘图工具);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(3);// 流式布局FlowLayoutflownewFlowLayout();jf.setLayout(flow);// 创建4个按钮JButtonbtnLinenewJButton(直线);JButtonbtnRectnewJButton(矩形);JButtonbtnTrinewJButton(等腰三角形);JButtonbtnClearnewJButton(清空);// 按钮添加到窗体jf.add(btnLine);jf.add(btnRect);jf.add(btnTri);jf.add(btnClear);// 创建监听器对象DrawListenerlistenernewDrawListener();// 获取窗体画笔引用传递给监听器Graphicsgrjf.getGraphics();listener.grgr;// 给4个按钮绑定动作监听器btnLine.addActionListener(listener);btnRect.addActionListener(listener);btnTri.addActionListener(listener);btnClear.addActionListener(listener);// 给窗体画布绑定鼠标监听器jf.addMouseListener(listener);jf.setVisible(true);}publicstaticvoidmain(String[]args){DrawUIuinewDrawUI();ui.showUI();}}DrawListener.javapackagezsy.op0912;importjava.awt.*;importjava.awt.event.*;/** * author SIYU * date 2026/9/19 19:31 * description 实现多接口MouseListener鼠标监听 ActionListener按钮动作监听 * 实现接口规则子类 implements 接口1,接口2 * 实现接口必须重写接口中所有抽象方法 * static静态修饰的属性/方法可以通过类名直接调用 */publicclassDrawListenerimplementsMouseListener,ActionListener{// 引用传递保存传递过来的画笔对象publicGraphicsgr;// 全局成员变量窗口左上角是坐标原点publicintx1,y1,x2,y2;publicStringDrawname;// 存储当前选中绘图类型名称// 动作监听器处理方法重写ActionListener接口的方法// actionPerformed按钮点击事件点击按钮立刻执行OverridepublicvoidactionPerformed(ActionEvente){// 获取按钮上的文字Stringnamee.getActionCommand();Drawnamename;System.out.println(点击按钮! name name);if(Drawname.equals(清空)){gr.clearRect(0,0,800,700);System.out.println(已清空画布);}}// MouseListener鼠标监听器 5个必须重写的方法 OverridepublicvoidmouseClicked(MouseEvente){System.out.println(点击);}OverridepublicvoidmousePressed(MouseEvente){System.out.println(按下);// 获取鼠标按下时坐标保存到全局变量x1e.getX();y1e.getY();}// mouseReleased鼠标松开事件绘图逻辑写在这里// 如果清空写在这个方法必须先在画布点一下鼠标松开才执行清空直接点按钮无反应OverridepublicvoidmouseReleased(MouseEvente){System.out.println(松开);// 获取松开坐标x2e.getX();y2e.getY();// 绝对值解决画图只能单向绘制问题保证宽高为正数intwMath.abs(x2-x1);inthMath.abs(y2-y1);// 取最小得到图形左上角坐标intmxMath.min(x1,x2);intmyMath.min(y1,y2);intMxMath.max(x1,x2);intMyMath.max(y1,y2);// 等腰三角形三个顶点x数组、y数组int[]px{mx,Mx,(mxMx)/2};int[]py{My,My,my};// 判断当前绘图类型调用对应画笔方法if(Drawname.equals(直线)){gr.drawLine(x1,y1,x2,y2);}if(Drawname.equals(矩形)){gr.drawRect(mx,my,w,h);}if(Drawname.equals(等腰三角形)){gr.drawPolygon(px,py,3);}}OverridepublicvoidmouseEntered(MouseEvente){}OverridepublicvoidmouseExited(MouseEvente){}}三、项目开发流程创建绘图窗体 UI 类JFrame 窗体添加直线、矩形、等腰三角形、清空按钮流式布局。创建监听器类DrawListener同时实现MouseListener和ActionListener接口重写全部 5 个鼠标方法 actionPerformed 方法。将监听器绑定到所有绘图按钮动作监听同时绑定到画布面板鼠标监听。点击按钮actionPerformed捕获按钮文字存入全局变量Drawname标记当前要画的图形类型。鼠标按下mousePressed获取按下坐标保存到x1,y1。鼠标松开mouseReleased获取松开坐标x2,y2计算宽高、左上角坐标根据Drawname判断图形类型调用画笔对应绘图方法完成绘制。点击清空按钮调用clearRect清空整个画布。四、易错点总结MouseListener 接口有 5 个方法缺一不可不需要功能的方法也要写空方法体否则编译报错。坐标原点在窗口左上角y 轴向下增大。绘制矩形时不能直接用按下松开坐标要通过 min、max 拿到左上角坐标abs 保证宽高为正数。字符串比较必须用.equals()不能用比较的是对象地址。画笔对象需要通过引用传递给监听器否则监听器无法绘图。