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()不能用比较的是对象地址。画笔对象需要通过引用传递给监听器否则监听器无法绘图。

相关新闻

开发接入如何验证代理IP真实性?伪静态代理IP辨别与自动化校验方案

开发接入如何验证代理IP真实性?伪静态代理IP辨别与自动化校验方案

在后端开发、接口对接、业务风控、日志分析等场景中,IP 地址是识别访问主体、保障业务安全、定位访问来源的重要依据。尤其在代理 IP 接入过程中,部分资源存在数据源失真、节点信息造假、归属地篡改等问题。如果直接接入业务系统,可能导致风控…

2026/9/24 13:55:27 阅读更多 →
如何让AI Agent的记忆检索更准?agent-memory混合检索与渐进式披露实战指南

如何让AI Agent的记忆检索更准?agent-memory混合检索与渐进式披露实战指南

如何让AI Agent的记忆检索更准?agent-memory混合检索与渐进式披露实战指南 【免费下载链接】agent-memory Memory 是一款面向 AI 智能体的长期记忆模块,为运行在 openJiuwen 框架上的智能体提供记忆提取、存储、检索与迁移能力。 项目地址: https://gi…

2026/9/24 13:54:27 阅读更多 →
Flet Router 之 use_view_path():为每个视图层级解析唯一路由地址

Flet Router 之 use_view_path():为每个视图层级解析唯一路由地址

Flet Router 之 use_view_path():为每个视图层级解析唯一路由地址 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet 导读 use_vie…

2026/9/24 13:54:27 阅读更多 →

最新新闻

OS第二章随手记(2.1)

OS第二章随手记(2.1)

目录 一、进程阻塞的过程 二、阻塞队列 三、对时钟中断与中断的思考🤔 四、虚拟地址的思考 五、保存程序状态 六、int 0x80 的思考 七、中断源 八、陷入机制 九、MMU的简略描述 十、王道题目知识点总结 一、进程阻塞的过程 进程调用了一个系统调用函数去访…

2026/9/25 16:54:19 阅读更多 →
写屏障机制原理

写屏障机制原理

写屏障机制原理 1. 核心概念与工作原理 并发 GC 最大的难题不是"如何快",而是"如何对"。当 GC 扫描与用户 goroutine 同时运行时,用户 goroutine 改写指针的瞬间可能让 GC 漏标存活对象。这就需要一种机制——每当用户程序执行指针赋…

2026/9/25 16:54:19 阅读更多 →
KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单

KytyPS5跨平台实战指南:Windows、Linux与macOS上运行PS5模拟器的终极配置清单 【免费下载链接】KytyPS5 PlayStation 5 emulator for Windows, Linux and MacOS 项目地址: https://gitcode.com/gh_mirrors/ky/KytyPS5 KytyPS5 是一款免费开源的 PS5 模拟器&a…

2026/9/25 16:54:19 阅读更多 →
恶意加密流量监测平台实战:从TLS 1.3特征工程到LightGBM与一维CNN模型部署

恶意加密流量监测平台实战:从TLS 1.3特征工程到LightGBM与一维CNN模型部署

简介:这份资源是面向网络安全与人工智能方向学习者、安全开发者的实战项目包,聚焦利用机器学习识别恶意加密流量这一核心难题。内容围绕数据预处理、特征工程、模型选择与评估展开,涉及SVM、随机森林、神经网络等算法,并讨论TLS指…

2026/9/25 16:54:19 阅读更多 →
OpenClaw 2.6.4 Windows 本地部署避坑指南:TaoToken 统一 Key 配置与 Gateway 排错实录

OpenClaw 2.6.4 Windows 本地部署避坑指南:TaoToken 统一 Key 配置与 Gateway 排错实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 16:54:19 阅读更多 →
基于SpringBoot的个人健康与运动习惯追踪系统设计与实现

基于SpringBoot的个人健康与运动习惯追踪系统设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着生活节奏的加快和工作压力的增大,久坐、缺乏运动、作息不规律等不良生活习惯日益普遍,亚健康状态成为现代人面临的突出问…

2026/9/25 16:53:19 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →