
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录前言一、整体思路二、涉及知识点含回顾内容1.Graphics2.两个数学工具三、DrawUI1. 窗体2. 功能按钮3. 监听器四、DrawListener1.实现接口2.全局变量3. 按钮4. 鼠标拖拽点获取5. 鼠标单击 mouseClicked完成任意三角形前言本篇笔记基于画图工具设计任务讲解鼠标监听器和动作监听器运用实现直线、矩形、任意三角形绘制等功能。一、整体思路整个项目分为两个类DrawUI 负责搭建主窗体、创建功能按钮、获取画笔对象、添加各类监听器、实现对象传递等。DrawListener 实现监听接收窗体传递的画笔根据鼠标动作、按钮选择完成图形绘制。二、涉及知识点含回顾内容1.Graphics注意画笔必须在窗体jf.setVisible(true);之后获取。通过窗体对象.getGraphics()拿到画笔对象采用引用传递将画笔传入监听器全局变量让监听器具备绘图能力。常用绘图方法drawLine(x1,y1,x2,y2)绘制直线drawRect(起点x,起点y,宽,高)绘制矩形setColor修改画笔颜色2.两个数学工具Math.abs(数值)求绝对值计算图形实际宽度、高度解决反向拖拽导致x2-x1为负无法执行的情况Math.min(a,b)取两个坐标最小值使矩形左上角为画笔起始点三、DrawUI1. 窗体创建JFrame窗体对象设置窗体尺寸、标题、屏幕居中、关闭程序规则设置流式布局FlowLayout让按钮横向排布自动换行3.必须在添加所有组件之后最后执行jf.setVisible(true);显示窗口2. 功能按钮依次创建多个按钮使用jf.add(按钮对象)使按钮全部添加到窗体上。3. 监听器实例化事件处理类DrawListener给窗体绑定鼠标监听器给所有功能按钮绑定动作监听器实现代码package ls.DrawUI;import javax.swing.*;import java.awt.*;public class DrawUI{publicvoidinitUI(){JFrame jfnewJFrame();jf.setSize(800,800);jf.setTitle(画图工具);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(3);jf.setVisible(true);DrawListener listenernewDrawListener();jf.addMouseListener(listener);Graphics gjf.getGraphics();listener.grg;}publicstaticvoidmain(String[]args){DrawUI uinewDrawUI();ui.initUI();}}四、DrawListener1.实现接口必须重写所有抽象方法。2.全局变量1.Graphics gr接收窗体传递过来的画笔2. 坐标变量x1,y1,x2,y2,x3,y3存储鼠标按下、松开、再次点击的点位3.String name存储当前点击按钮文字用来判断要绘制哪种图形4.int flag标记位控制代码执行顺序实现任意三角形分步选点。3. 按钮点击按钮时通过e.getActionCommand()获取按钮文字存入全局变量name完成绘图模式切换。4. 鼠标拖拽点获取1.mousePressed鼠标按下记录起点坐标x1、y12.mouseReleased鼠标松开记录终点坐标x2、y2拖拽完成根据当前按钮模式绘制直线 / 矩形若选中三角形仅绘制底边线段同时flag条件判断后识别第三个顶点。5. 鼠标单击 mouseClicked完成任意三角形选中三角形模式、拖拽完成底边后再次窗体单击获取第三个点x3,y3分别连接底边两个端点与第三个点位闭合形成完整任意三角形重置标记位。实行代码import javax.swing.*;import java.awt.*;public class DrawUI{publicvoidinitUI(){JFrame jfnewJFrame();jf.setSize(800,800);jf.setTitle(画图工具);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(3);FlowLayout flownewFlowLayout();jf.setLayout(flow);JButton jbunewJButton(直线);jf.add(jbu);JButton jbu2newJButton(矩形);jf.add(jbu2);JButton jbu3newJButton(三角形);jf.add(jbu3);JButton rednewJButton(红色);jf.add(red);jf.setVisible(true);Graphics gjf.getGraphics();DrawListener listenernewDrawListener();jf.addMouseListener(listener);jbu.addActionListener(listener);jbu2.addActionListener(listener);jbu3.addActionListener(listener);listener.grg;}publicstaticvoidmain(String[]args){DrawUI uinewDrawUI();ui.initUI();}}import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;public class DrawListener implements MouseListener,ActionListener{public Graphics gr;publicintx1,y1,x2,y2,x3,y3;public String name;publicintflag1;publicvoidactionPerformed(ActionEvent e){namee.getActionCommand();}publicvoidmouseClicked(MouseEvent e){if(三角形.equals(name)){x3e.getX();y3e.getY();gr.drawLine(x1,y1,x3,y3);gr.drawLine(x2,y2,x3,y3);flag1;}}publicvoidmousePressed(MouseEvent e){if(flag1){x1e.getX();y1e.getY();}}publicvoidmouseReleased(MouseEvent e){if(flag1){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,y1,x2,y2);flag;}}publicvoidmouseEntered(MouseEvent e){}publicvoidmouseExited(MouseEvent e){}}