关于画图工具的优化
关于画图工具的优化针对于之前的画图的优化有以下几点1曲线的增加2 对于橡皮擦的优化3 关于粗细的调整4对于移动窗体画图的消失1曲线的增加主要用到了新的监听器MouseMotionListener他有俩个方法分别为mouseDragged和mouseMove主要用到了mouseDragged具体如下1导入接口2实现方法3具体代码在x4e.getX();y4e.getY();if (“曲线”.equals(name)){gr.drawLine(x1,y1,x4,y4);x1x4; y1y4;2对于橡皮擦的优化与曲线相同注意有转画笔 后会讲g2 (Graphics2D) gr;g2.setStroke(new BasicStroke(width));gr.setColor(color);上为转画笔g2.setStroke(new BasicStroke(8));gr.setColor(Color.white); gr.drawLine(x1,y1,x4,y4); x1x4; y1y4;3 关于粗细的调整在转画笔后int width1;g2 (Graphics2D) gr;g2.setStroke(new BasicStroke(width));//上面的width后填数来控制粗细4 对于移动窗体画图的消失这是本篇的大头首先再建俩个类一个继承Jpanel一个创建对象思路为通过继承来重画进而解决移动窗体画图的消失具体代码如下1主体建立窗体,传递数据public class drawtooi { public void initUI() { JFrame jf new JFrame(); jf.setSize(1000, 1000); jf.setTitle(drawtool); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel northJpanelnew JPanel(); northJpanel.setBackground(Color.blue); Dimension dinew Dimension(); di.setSize(0,50); jf.add(northJpanel,BorderLayout.NORTH); draw1 listenernew draw1(); String []name{直线,矩形,三角形,多边形,圆,椭圆,等腰三角形,红色,蓝色,粗,细,曲线,橡皮擦}; for (String s : name) { JButton jbu new JButton(s); northJpanel.add(jbu); jbu.addActionListener(listener); } MPanel drawPanelnew MPanel();// 这为与之前的不同 drawPanel.setBackground(Color.white); jf.add(drawPanel,BorderLayout.CENTER); jf.setVisible(true); Graphics g drawPanel.getGraphics(); drawPanel.addMouseListener(listener); drawPanel.addMouseMotionListener(listener); listener.gr g; drawPanel.shapeArr listener.shapeArr;// 其次是这传递数据 } public static void main(String[] args) { drawtooi ui new drawtooi(); ui.initUI(); }}2画图工具先别管shape他就是传数据注曲线和橡皮擦都有public class draw1 implements MouseListener, ActionListener, MouseMotionListener { public Graphics gr; public int x1, y1, x2, y2, x3, y3,x4,y4; private String name; private int clickCount 0; private boolean triangleReady false; public Color colorColor.black; public int width1; public Graphics2D g2; public shapes[] shapeArr new shapes[10000]; //操作数组的下标 public int index 0; Override public void actionPerformed(ActionEvent e) { String str e.getActionCommand(); if (红色.equals(str)) { color Color.RED; } else if (蓝色.equals(str)) { color Color.BLUE; } else if (粗.equals(str)) { width 5; }else if (细.equals(str)){ width1; } else{ //表示点击图形按钮 //获取按钮上的内容 name e.getActionCommand(); } g2 (Graphics2D) gr; g2.setStroke(new BasicStroke(width)); gr.setColor(color); } Override public void mouseClicked(MouseEvent e) { if (三角形.equals(name)) { if (triangleReady) { clickCount 0; triangleReady false; return; } clickCount; if (clickCount 1) { x1 e.getX(); y1 e.getY(); } if (clickCount 2) { x2 e.getX(); y2 e.getY(); gr.drawLine(x1, y1, x2, y2); // 第一条边 System.out.println(x1 x1 y1 y1); System.out.println(x2 x2 y2 y2); } if (clickCount 3) { x3 e.getX(); y3 e.getY(); triangleReady true; clickCount 0; // ---- 补全缺失的两条边 ---- gr.drawLine(x1, y1, x3, y3); gr.drawLine(x2, y2, x3, y3); System.out.println(x1 x1 y1 y1); System.out.println(x2 x2 y2 y2); System.out.println(x3 x3 y3 y3); clickCount 0; shapes shape new shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shape.x3x3; shape.y3y3; shapeArr[index] shape; index; } } if (多边形.equals(name)){ clickCount; if(clickCount1){ x1e.getX(); y1e.getY(); } if (clickCount2){ x2e.getX(); y2e.getY(); gr.drawLine(x1,y1,x2,y2); shapes shapenew shapes(); shape.namename; shape.colorcolor; shape.Widthwidth; shape.x1x1;shape.y1y1; shape.x2x2;shape.y2y2; shapeArr[index] shape; index; } if (clickCount3){ x3e.getX(); y3e.getY(); gr.drawLine(x2,y2,x3,y3); shapes shapenew shapes(); shape.namename; shape.colorcolor; shape.Widthwidth; shape.x1x2;shape.y1y2; shape.x2x3;shape.y2y3; shapeArr[index] shape; index; x2x3; y2y3; if (e.getClickCount()2){ shapes closeshapenew shapes(); closeshape.namename; closeshape.colorcolor; closeshape.Widthwidth; closeshape.x1x1;closeshape.y1y1; closeshape.x2x3;closeshape.y2y3; shapeArr[index]closeshape; index; gr.drawLine(x1,y1,x3,y3); clickCount0; } } } } Override public void mousePressed(MouseEvent e) { if (三角形.equals(name)) { return; } if (多边形.equals(name)) { return; } x1 e.getX(); y1 e.getY(); } Override public void mouseReleased(MouseEvent e) { if (多边形.equals(name)) { return; } if (三角形.equals(name)) { return; } x2 e.getX(); y2 e.getY(); //绝对值 int w Math.abs(x2 - x1); int q Math.abs(y2 - y1); //取最小值 int mx Math.min(x1, x2); int my Math.min(y1, y2); int top (x1 x2) / 2; if (直线.equals(name)) { gr.drawLine(x1, y1, x2, y2); shapes shape new shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shapeArr[index] shape; index; } if (矩形.equals(name)) { gr.drawRect(mx, my, w, q); shapes shape new shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shapeArr[index] shape; index; } if (等腰三角形.equals(name)) { gr.drawLine(top, y1, x2, y2); gr.drawLine(x1, y2, x2, y2); gr.drawLine(top, y1, x1, y2); shapes shapenew shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shapeArr[index] shape; index; } if (圆.equals(name)){ gr.drawOval(x1,y1,w,w); shapes shapenew shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shapeArr[index] shape; index; } if (椭圆.equals(name)){ gr.drawOval(x1,y1,w,q); shapes shapenew shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x2; shape.y2 y2; shapeArr[index] shape; index; } } Override public void mouseEntered(MouseEvent e) { } Override public void mouseExited(MouseEvent e) { } Override public void mouseDragged(MouseEvent e) { x4e.getX(); y4e.getY(); if (曲线.equals(name)){ gr.drawLine(x1,y1,x4,y4); shapes shapenew shapes(); shape.name name; shape.colorcolor; shape.Widthwidth; shape.x1 x1; shape.y1 y1; shape.x2 x4; shape.y2 y4; shapeArr[index] shape; index; x1x4; y1y4; } if (橡皮擦.equals(name)){ g2.setStroke(new BasicStroke(8)); gr.setColor(Color.white); gr.drawLine(x1,y1,x4,y4); shapes shapenew shapes(); shape.name name; shape.colorcolor; shape.Width8; shape.x1 x1; shape.y1 y1; shape.x2 x4; shape.y2 y4; shapeArr[index] shape; index; x1x4; y1y4; } } Override public void mouseMoved(MouseEvent e) {}}3继承重中之重在之前提过superpublic class MPanel extends JPanel {public shapes[] shapeArr; //保存图形的数组//重写paint方法 public void paint(Graphics g) { //保留绘制组件的功能 super.paint(g); System.out.println(paint...); //取出所有的图形对象实现重绘 for (shapes shapes : shapeArr) { if (shapes null) continue; shapes.drawshape(g); } }}4重画public class shapes {public int x1,y1,x2,y2,x3,y3; public int Width; public Color colorColor.black; public String name; public void drawshape(Graphics g){ if (gnull)return; Graphics2D g2d(Graphics2D) g; g2d.setColor(this.color); g2d.setStroke(new BasicStroke(Width)); if (name !null) { switch (name) { case 直线: g2d.drawLine(x1, y1, x2, y2); break; case 矩形: int x Math.min(x1, x2); int y Math.min(y1, y2); int w Math.abs(x1 - x2); int h Math.abs(y2 - y1); g2d.drawRect(x, y, w, h); break; case 等腰三角形: int top (x1 x2) / 2; g2d.drawLine(top, y1, x2, y2); g2d.drawLine(x1, y2, x2, y2); g2d.drawLine(top, y1, x1, y2); break; case 圆: int m Math.abs(x1 - x2); g2d.drawOval(x1, y1, m, m); case 椭圆: int width Math.abs(x1 - x2); int height Math.abs(y1 - y2); g2d.drawOval(x1, y2, width, height); case 三角形: g2d.drawLine(x1, y1, x2, y2); g2d.drawLine(x1, y1, x3, y3); g2d.drawLine(x3, y3, x2, y2); break; case 多边形: g2d.drawLine(x1,y1,x2,y2); break; case 曲线: g2d.drawLine(x1,y1,x2,y2); break; case 橡皮擦: g2d.setColor(Color.white); g2d.drawLine(x1,y1,x2,y2); } } }}5讲解1shape为一个数组来计录画图的点与按键的名称画图的粗细与颜色来实现重画2继承了Jpanel的方法用了super加了一个方法通过数组来计录方便重画34中的case与if相同及中的相同就运行后的再运行后要加break停止运行4在多边形的重画中建了一个新数组来计录一开始的点避免找不到一开始的点就可以闭合5在曲线与橡皮擦的重画可以看成无数个线段连成在画是一样在画时与多边形相同不断更新来实现不断画

相关新闻

50元预算实现专业级AI音频降噪方案

50元预算实现专业级AI音频降噪方案

1. 项目概述:低成本AI降噪方案的价值与定位作为一名长期关注音频处理技术的从业者,我深刻理解学生群体在专业学习中对降噪工具的需求与预算限制之间的矛盾。市面上主流AI降噪软件如Adobe Audition、iZotope RX动辄上千元的年费订阅,而专业录音…

2026/9/25 22:56:24 阅读更多 →
中国供应链EMBA横评:复旦科创生态如何赋能东南亚

中国供应链EMBA横评:复旦科创生态如何赋能东南亚

引言 东南亚华裔企业家希望链接中国产业链,泰国高管希望理解中国市场,两类申请人的共同需求是进入稳定的华语商业环境,并获得课程、校友与产业场景的持续支持。中文沟通只是起点,项目能否连接目标行业、长三角供应链、科创资源和亚…

2026/9/25 22:58:01 阅读更多 →
CAD与影像数据高精度套合技术解析

CAD与影像数据高精度套合技术解析

1. 影像与CAD工程文件精确套合的核心挑战在工程测绘与地理信息领域,将遥感影像、航拍图等栅格数据与CAD矢量图纸进行空间对齐是一项基础但极具技术含量的工作。我从业十余年处理过数百个套合项目,发现90%的精度问题都源于坐标系转换、控制点选取和文件格…

2026/9/25 0:44:55 阅读更多 →

最新新闻

东莞市品牌网站建设报价常见报错与解决

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:01:35 阅读更多 →
不会代码选南昌企业网站设计公司,3个坑位看怎么选

不会代码选南昌企业网站设计公司,3个坑位看怎么选

不会代码选南昌企业网站设计公司,3个坑位看怎么选 自己不会代码想做网站,这是很多老板和初创团队最头疼的事。你不懂前端后端,不懂服务器配置,但公司又急需一个能展示形象、能接询盘的官网。这时候去找南昌本地企业网站设计公司,心里肯定打鼓:怎么选才…

2026/9/27 0:01:35 阅读更多 →
哪个网站生鲜配送做的好处免费工具推荐

哪个网站生鲜配送做的好处免费工具推荐

3个坑避开备案迷雾:生鲜配送网站最佳实践 备案流程一头雾水?别慌。刚做生鲜配送站时,我因域名后缀选错被退回3次,损失2周上线时间。后来摸索出 最佳实践…

2026/9/27 0:01:35 阅读更多 →
免费网站空间申请教程详细步骤

免费网站空间申请教程详细步骤

3步搞定免费空间申请:新手建站避坑指南详解 域名买好了,服务器却像天书?别慌,很多创业团队负责人第一步就卡在这里。其实免费网站空间申请教程并非高深理论,而是实操细节的堆砌。今天这篇避坑指南,专为搞不懂域名与服务器关系的新手准备,咱们不整虚的…

2026/9/27 0:01:35 阅读更多 →
百度搜索网页版从零搭建全攻略

百度搜索网页版从零搭建全攻略

百度搜索网页版从零搭建全攻略 改个需求建站公司拖一周,这种憋屈感独立站长都懂。 想彻底摆脱被动,就得掌握从零搭建的能力。 哪怕只是做一个简单的【百度搜索网页版】接口展示页,你也得懂域名、服务器和部署逻辑。…

2026/9/27 0:00:34 阅读更多 →
旅游网站建设与翻译源码下载

旅游网站建设与翻译源码下载

不会代码做旅游网站?3个实战案例教你搞定翻译与部署 你是不是正卡在“想做旅游网站但完全不懂代码”的困境里?别慌,我见过太多河北做民宿、做地接社的朋友,最后都靠这套流程搞定了。今天拆解3个 实战案例 ,从翻译到上线,手把手带你把坑填平。…

2026/9/27 0:00:34 阅读更多 →

日新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/26 22:52:30 阅读更多 →