新闻详情

新闻详情

首页 / 资讯中心 / 详情

简易画图工具的实现3

发布时间:2026/9/29 15:09:23来源:尧图网络
简易画图工具的实现3
前言继上篇笔记当时鼠标监听器绑定在JFrame窗体上会出现绘图坐标错位同时任意三角形交互逻辑不完善。本次修复坐标偏移问题完善自定义三角形绘制逻辑使用flag状态变量控制多步绘图流程。一、实现思路这个画图工具的核心就是窗体 事件监听器。我们分成两大块来写DrawUI3 负责搭建窗口、创建顶部按钮面板、白色绘图画布鼠标监听器绑定绘图面板解决坐标错位把监听器绑定到按钮上。DrawListener3 实现 ActionListener 和 MouseListener 接收按钮点击事件、鼠标按下/松开/单击事件拿到画布画笔去绘图使用flag标记记录绘图阶段。整体流程点击图形/颜色按钮 → 记录当前选中的功能重置绘图状态 → 在白色画布上操作鼠标 → 监听器捕获画布鼠标坐标 → 一步式图形直接绘图自定义三角形先拖拽底边flag切换状态单击画布获取第三个顶点完成闭合。二、实现步骤步骤1搭建主窗体我们先创建 JFrame 窗口设置大小、标题、关闭方式使用BorderLayout布局上方放置JPanel存放功能按钮中间JPanel作为白色绘图画布创建各个功能按钮直线、矩形、等腰三角形、三角形、蓝色、红色、黑色步骤2编写监听器监听器需要实现两个接口1、ActionListener 监听按钮点击记住现在要画什么图形 / 什么颜色切换按钮重置flag状态。2、MouseListener 监听鼠标按下、松开、单击获取坐标完成绘图。需要定义的变量1、Graphics gr 画笔2、x1,y1 鼠标按下起点 x2,y2 鼠标松开终点 x3,y3 三角形第三个点3、String name 保存当前选中的功能名称4、boolean flag绘图状态标记true可以拖拽绘制底边false等待单击获取三角形顶点然后重写五个鼠标方法 按钮响应方法1、actionPerformed() 按钮被点击更新 name、设置画笔颜色重置flag绘图状态2、mousePressed() 鼠标按下flag为true时记录起点 x1,y13、mouseReleased() 鼠标松开拿到终点 x2,y2执行直线、矩形、等腰三角形三角形模式绘制底边将flag置为false等待单击4、mouseClicked()鼠标单击flag为false时获取三角形第三个点连线闭合三角形重置flag5、mouseEntered / mouseExited 接口必须实现这里暂时留空三、代码案例packagesy0922;importjavax.swing.*;importjava.awt.*;importjava.net.http.WebSocket;publicclassDrawUI3{publicvoidinitUI(){JFramejfnewJFrame();jf.setTitle(画图工具);jf.setSize(800,800);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(3);JPanelnorthPanelnewJPanel();northPanel.setBackground(Color.PINK);northPanel.setPreferredSize(newDimension(0,40));jf.add(northPanel,BorderLayout.NORTH);JButtonjbunewJButton(直线);northPanel.add(jbu);JButtonjbu2newJButton(矩形);northPanel.add(jbu2);JButtonjbu3newJButton(等腰三角形);northPanel.add(jbu3);JButtonjbu4newJButton(三角形);northPanel.add(jbu4);JButtonjbu5newJButton(多边形);northPanel.add(jbu5);JButtonbluenewJButton(蓝色);northPanel.add(blue);JButtonrednewJButton(红色);northPanel.add(red);JButtonblacknewJButton(黑色);northPanel.add(black);JPaneldrawPanelnewJPanel();jf.add(drawPanel,BorderLayout.CENTER);jf.setVisible(true);GraphicsgdrawPanel.getGraphics();DrawListener3listenernewDrawListener3();listener.grg;drawPanel.addMouseListener(listener);jbu.addActionListener(listener);jbu2.addActionListener(listener);jbu3.addActionListener(listener);jbu4.addActionListener(listener);jbu5.addActionListener(listener);blue.addActionListener(listener);red.addActionListener(listener);black.addActionListener(listener);listener.grg;}publicstaticvoidmain(String[]args){DrawUI3uinewDrawUI3();ui.initUI();}}packagesy0922;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;publicclassDrawListener3implementsMouseListener,ActionListener{publicGraphicsgr;publicintx1,y1,x2,y2,x3,y3;publicStringname;publicbooleanflagtrue;publicvoidactionPerformed(ActionEvente){namee.getActionCommand();if(蓝色.equals(name)){gr.setColor(Color.blue);}if(红色.equals(name)){gr.setColor(Color.red);}if(黑色.equals(name)){gr.setColor(Color.black);}}publicvoidmouseClicked(MouseEvente){x3e.getX();y3e.getY();if(三角形.equals(name)){gr.drawLine(x1,y1,x3,y3);gr.drawLine(x2,y2,x3,y3);flagtrue;}}publicvoidmousePressed(MouseEvente){if(flagtrue){x1e.getX();y1e.getY();}}publicvoidmouseReleased(MouseEvente){if(flagtrue){x2e.getX();y2e.getY();}intwMath.abs(x1-x2);intmxMath.min(x1,x2);if(直线.equals(name)){gr.drawLine(x1,y1,x2,y2);}if(矩形.equals(name)){gr.drawRect(mx,y1,w,y2-y1);}if(等腰三角形.equals(name)){gr.drawLine(x1,y2,(x1x2)/2,y1);gr.drawLine((x1x2)/2,y1,x2,y2);gr.drawLine(x1,y2,x2,y2);}if(三角形.equals(name)){gr.drawLine(x1,y1,x2,y2);flagfalse;}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}}运行结果五、学习小结画图工具的实现本身不难难的是状态管理。像直线这种“一步完成”的图形很好写但像任意三角形这种需要两次鼠标动作的图形就必须使用flag变量记住程序当前处于哪一个阶段。同时理解不同组件的鼠标坐标原点差异监听器绑定不同组件拿到的鼠标坐标结果完全不一样。后续还可以继续拓展实现清空画布、多边形绘制等功能。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STM32F103嵌入式入门:从裸机启动到USB虚拟串口实战 2026/9/29 16:10:57

STM32F103嵌入式入门:从裸机启动到USB虚拟串口实战

1. 这块STM32F103开发板,不是玩具,是嵌入式工程师的“第一把刻刀”你拆开快递盒,看到那块蓝绿色PCB板上印着“STM32F103C8T6”几个字,旁边插着个小小的ST-Link V2调试器——恭喜,你正式踏入了真实嵌入式世界的门槛。这…

阅读更多 →
小程序开发提效:开发者工具插件推荐与 TaoToken 统一 Key 配置 2026/9/29 16:10:57

小程序开发提效:开发者工具插件推荐与 TaoToken 统一 Key 配置

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

阅读更多 →
注塑机数据采集全指南:从协议选型到系统落地与排障 2026/9/29 16:10:57

注塑机数据采集全指南:从协议选型到系统落地与排障

1. 注塑机数据采集这件事,到底在解决什么问题先聊点实际的。做了这么多年注塑车间信息化,接过的工厂没有一百也有八十家,几乎每个老板上来都会问同一句话:我的机器到底在干什么?停机了多久?产能到底多少&am…

阅读更多 →
DeepSeek+Mermaid:自然语言生成流程图与架构图实战 2026/9/29 16:10:57

DeepSeek+Mermaid:自然语言生成流程图与架构图实战

简介:这份文档面向具备一定编程基础的研发人员、项目经理与数据分析师,聚焦如何借助DeepSeek大语言模型将自然语言指令转化为Mermaid代码,再由Mermaid渲染为流程图、序列图、甘特图等可视化图表,从而提升需求分析、系统设计、编码…

阅读更多 →
用 lark-cli 一个月后,我把飞书 AI 操作接进了 TaoToken 统一通道 2026/9/29 16:10:56

用 lark-cli 一个月后,我把飞书 AI 操作接进了 TaoToken 统一通道

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

阅读更多 →
IDEA插件开发实战:为Claude Code和Codex打造GUI集成 2026/9/29 16:10:48

IDEA插件开发实战:为Claude Code和Codex打造GUI集成

开局先交代背景:Claude Code 和 Codex 这两个 AI 编码助手,最近几乎是开发者圈子里绕不开的话题。一个是 Anthropic 家的,一个是 OpenAI 家的,能力各有侧重,但真有一个共同槽点——它们默认都是命令行工具。你想在 IDE…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉