首页/新闻资讯/正文详情

Java绘图项目详解

发布时间:2026/9/24 13:55:20 来源:云帆数科 栏目:资讯中心
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()不能用比较的是对象地址。画笔对象需要通过引用传递给监听器否则监听器无法绘图。

相关推荐

进口实验室仪器的国产替代品牌推荐?
进口实验室仪器的国产替代品牌推荐?

实验室采购做进口与国产的权衡,本质是三笔账:性能、合规、全生命周期成本。国产替代不是一次全换,合理的顺序是先换技术成熟度高的品类,再按方法验证推进分析主机。本文按通用和分析仪器两条线盘点五个国产代表品牌,供… · 2026/9/24 13:55:07

Jetson AGX Orin 性能调优:nvpmodel 与 jetson_clocks 实战指南
Jetson AGX Orin 性能调优:nvpmodel 与 jetson_clocks 实战指南

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

【计算机毕业设计单片机案例】基于 STM32 的室内烟雾 PM2.5 监测联动排风报警系统设计 基于 STM32 的本地多模式环境调控与远程数据查看系统设计(010309)
【计算机毕业设计单片机案例】基于 STM32 的室内烟雾 PM2.5 监测联动排风报警系统设计 基于 STM32 的本地多模式环境调控与远程数据查看系统设计(010309)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️… · 2026/9/24 13:55:01

IDA Pro MCP 拆解:屡次失败的 so 算法逆向一小时收工,Agent 直操 IDA 之后,「手动反编译喂 AI」的工作流已经过时
IDA Pro MCP 拆解:屡次失败的 so 算法逆向一小时收工,Agent 直操 IDA 之后,「手动反编译喂 AI」的工作流已经过时

同一个 so 文件里的加密算法,同一批人试了很多次都没拿下。2026 年 9 月的一次社群实测里,这个僵持许久的任务在一小时内被攻破。破局点不是更强的模型,也不是更贵的算力。真正的变量是一个 MCP 服务器:IDA Pro MCP。它让 Agent 直… · 2026/9/24 20:24:04

Sinon 断言 `assert.neverCalledWithMatch` 深入解析:验证 fake/spy/stub 从未以“匹配”参数被调用
Sinon 断言 `assert.neverCalledWithMatch` 深入解析:验证 fake/spy/stub 从未以“匹配”参数被调用

Sinon 断言 assert.neverCalledWithMatch 深入解析:验证 fake/spy/stub 从未以“匹配”参数被调用 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon sinon.assert.neverCalledWithMa… · 2026/9/24 20:24:04

基于SpringBoot+Vue的高校就业管理系统设计与实现
基于SpringBoot+Vue的高校就业管理系统设计与实现

1. 毕设选题复盘:为什么我敲定了高校就业管理系统每年到了毕设开题季,大批计算机专业的学生就开始在“图书管理系统”“商城系统”“酒店管理系统”里反复横跳。说实话,这几个方向已经被做到快烂大街了,答辩现场撞题率极高&#x… · 2026/9/24 20:23:58

抖音视频只推荐一次?深度解析前置审核机制与流量分发逻辑
抖音视频只推荐一次?深度解析前置审核机制与流量分发逻辑

很多做抖音的朋友都经历过这种场景:精心剪了一下午的视频发出去,隔一小时看一次播放量,数字像钉在墙上一样纹丝不动,到最后只看到孤零零的一个推荐,平台像是把你的内容扔进了一个没人的角落,再也没多给过一… · 2026/9/24 20:23:58

用MATLAB实现电晕放电电场仿真与数值分析
用MATLAB实现电晕放电电场仿真与数值分析

电晕放电这个词,听起来像是高电压专业才会碰到的冷门概念,但只要你接触过高压输电、绝缘设计、静电除尘,甚至只是做过高压实验,就一定绕不开它。简单说,电晕放电是导体表面电场强度超过空气击穿场强时,周围… · 2026/9/24 20:23:58

工业AI落地的终局不是替代人,而是人机协同的三大变革与实操避坑指南
工业AI落地的终局不是替代人,而是人机协同的三大变革与实操避坑指南

工业项目的落地会上,大家聊来聊去还是那几个问题:AI识别率够不够、能不能顶掉夜班质检、设备报警准不准。可我最近跑了几条产线、复盘了几个项目之后,越来越确定一件事——AI在工业里真正站住脚的,没有一个是靠“把人换下来”&… · 2026/9/24 20:23:58

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码