关于画图工具的优化 关于画图工具的优化针对于之前的画图的优化有以下几点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在曲线与橡皮擦的重画可以看成无数个线段连成在画是一样在画时与多边形相同不断更新来实现不断画

相关新闻

最新新闻

C++内存序深度解析:从硬件原理到多线程编程实战

C++内存序深度解析:从硬件原理到多线程编程实战

1. 内存序到底是什么?为什么C程序员必须懂它?如果你写过C多线程程序,并且用过std::atomic,那你大概率见过memory_order_relaxed、memory_order_acquire这些枚举值。第一次看到它们时,你是不是和我当初一样,…

2026/8/16 3:23:43
Windows 10 PIN码失效的深度修复指南:从原理到实战解决方案

Windows 10 PIN码失效的深度修复指南:从原理到实战解决方案

1. 问题现象与核心原因剖析“出现问题,你的PIN不可用。单击以重新设置PIN。”——这个弹窗对于Windows 10用户来说,绝对是个能瞬间让人血压升高的“拦路虎”。你正急着登录电脑处理工作,或者只是想打开电脑放松一下,结果被这个冷冰…

2026/8/16 3:23:43
试用期总结撰写指南:从复盘到规划,助力职场新人顺利转正

试用期总结撰写指南:从复盘到规划,助力职场新人顺利转正

1. 为什么一份好的试用期总结,远不止是“交差”又到一年毕业季和招聘季,很多新同学刚进公司,或者转岗到一个新部门,都会面临一个共同的“小考”:试用期总结报告。很多人把它当成一个不得不走的过场,网上随便…

2026/8/16 3:23:43
Grok Build本地化视频处理:从部署到API集成的完整实践指南

Grok Build本地化视频处理:从部署到API集成的完整实践指南

这次我们来看一个近期在技术圈引发关注的项目:Grok Build。这个名字你可能在社交媒体上看到过,因为埃隆马斯克曾公开称赞其视频处理能力。它不是一个单纯的AI聊天机器人,而是一个集成了强大视频、音频处理能力的本地化工具或框架。对于开发者…

2026/8/16 3:23:43
彻底解决VsCode中文乱码:从编码原理到实战根治方案

彻底解决VsCode中文乱码:从编码原理到实战根治方案

1. 问题现象与核心根源剖析如果你在用 VsCode 写代码或者处理文本时,发现控制台、终端或者文件里本该显示“你好,世界”的地方,变成了一堆“锟斤拷”或者“烫烫烫”之类的乱码,别慌,这几乎是每个开发者都会踩的坑。这个…

2026/8/16 3:23:43
补种未成活胡杨

补种未成活胡杨

一、题目 题目描述 近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。 一个月后,有M棵胡杨未能成活。 现可补种胡杨K棵,请问如何补种(只能补种,不能新种…

2026/8/16 3:18:42