基于Java实现的绘图软件工具设计

article/2025/8/16 19:16:13

基于Java实现的绘图软件工具设计 演示视频

基于Java设计的绘图工具

01. 题目要求

做一个简单的绘图工具,以CAD的方式操作,能放置直线、矩形、圆和文字,能选中图形,修改参数,如颜色等,能拖动图形和调整大小,可以保存和恢复。功能请参考视频演示。
要求上传:

  1. 源码;
  2. 实验报告;
  3. 可执行的jar文件。

02. 操作手册

做一个简单的绘图工具,以CAD的方式操作。

  • 界面

在这里插入图片描述

  • 铅笔 & 刷子

    • 支持回退
    • 支持撤销回退
    • 支持橡皮
  • 喷枪

    • 支持橡皮
  • 直线 & 圆 & 矩形

    • 支持在拖动时调整大小
    • 支持选择后拖动
    • 支持加粗 变细
    • 支持放大 缩小
    • 支持回退 撤销回退
    • 支持删除
  • 文字

    • 输入文字后需拖动产生对象
    • 支持放大 缩小
  • 橡皮

    • 此功能不支持拖动
  • 选择

    • 按下后,可以在画布中选中图形,也可以拖动图形
    • 鼠标单击时,在矩形的内部和边界,矩形被选中
    • 鼠标单击时,在文字的内部和边界,椭圆被选中
    • 鼠标单击时,在椭圆的内部和边界,椭圆被选中
    • 鼠标单击时,在直线的内部和边界,椭圆被选中
    • 如果同时有多个图形能被选中,取最上面那个
  • 删除

    • 需先选中对象
    • 按下删除键后可以从画图板中删除
  • 回退

    • 回退最近的一次画图操作
    • 回退的只是目前画板最上层的对象
    • 删除一个对象后是无法回退的
    • 如果通过鼠标单击拖动某图形,它会位于最高层,回退时会先回退
  • 撤销回退

    • 重做最近的一次画图操作
  • 保存

    • 按下后会弹出一个对话框,输入需保存的文件名
    • 可将当前画板的所有对象序列化输出
    • 文件保存在项目文件下
  • 打开

    • 按下后会弹出一个对话框,输入将打开的文件名
    • 可将当前画板的所有对象序列化输出
    • 打开项目文件路径下的文件
  • 颜色面板

    • 可以切换所有图形的颜色
  • 案例

在这里插入图片描述

03.代码细节

3.1 框架

在这里插入图片描述

  • 抽象类Shape类,用来描述一个图形
    • Circle Eraser Rect String GUm Line MyString 继承Shape抽象类
      • 实现抽象函数 public abstract void draw(Graphics2D g)画图形
      • 实现抽象函数 public abstract boolean click( double curX, double curY ) 判断是否被选中
  • 所有任务都由Draw类分配
    • 实现 ActionListener, MouseListener, MouseMotionListener接口监听鼠标操作
      • 重载public void actionPerformed(ActionEvent e)
      • 重载public void mousePressed(MouseEvent e)
      • 重载public void mouseReleased(MouseEvent e)
      • 重载public void mouseDragged(MouseEvent e)

3.2 图形表示

Circle为例

  • 设置抽象了你Shape,用来描述一个图形

    • (x1,y1)表示左上角坐标,(x2,y2)表示右下角坐标,color表示颜色信息,stroke表示字体粗细。

    • 需要实现两个虚函数draw(Graphics2D g) click( double curX, double curY ),分别表示图形绘制和判断鼠标是否点击该图形。

    // 函数的具体实现详见代码
    public abstract class Shape implements Serializable{private int x1, x2, y1, y2;private Color color;private int stroke;public Shape( int x1, int y1, int x2, int y2, Color c, int s ){stroke = s;color = c;this.x1 = x1;this.x2 = x2;this.y1 = y1;this.y2 = y2;}public abstract void draw(Graphics2D g);	public abstract boolean click( double curX, double curY );    public void move( int dx, int dy ){}public int getX1(){}public void setX1(int x1){}public int getX2(){}public void setX2(int x2){}public int getY1(){}public void setY1(int y1){}public int getY2(){}public void setY2(int y2){}public Color getColor(){}public void setColor( Color c){}public BasicStroke getStroke() {}    public void setStroke( int s ){}public void addX1(int dx){}public void addX2(int dx){}public void addY1(int dy){}public void addY2(int dy){}public void enlarge() {}public void narrow() {}
    }
    
  • 六个类Circle, Eraser, Gum, Line, MyString, Rect,均继承自Shape

    public class Circle extends Shape {public Circle(int x1, int y1, int x2, int y2, Color color,int s) {super(x1, y1, x2, y2, color, s);}public void draw(Graphics2D g) {int x1 = Math.min(getX1(), getX2());int x2 = Math.max(getX1(), getX2());int y1 = Math.min(getY1(), getY2());int y2 = Math.max(getY1(), getY2());g.setStroke(getStroke());g.setColor(getColor());Ellipse2D circle = new Ellipse2D.Double(x1, y1, x2 - x1, y2 - y1);g.draw(circle);}public boolean click(double x, double y){int x1 = Math.min(getX1(), getX2());int x2 = Math.max(getX1(), getX2());int y1 = Math.min(getY1(), getY2());int y2 = Math.max(getY1(), getY2());	return ( x >= x1 && x <= x2 && y >= y1 && y <= y2);	}
    }
    

3.3 存储和删除

  • 全局Stack<Shape>DoList 用来存储所有已绘制的图形。
  • 删除时,直接在 Dolist 里用 remove 函数删掉对应的对象。所以说,删除操作不支持撤销。
  • 开一个 Stack<Shape>TodoList 用来恢复绘图。具体地,每次撤销时,将 DoList 栈顶元素弹出,压入 TodoList 里。每次重做时,重复相反过程。
  • 每当撤销绘制后,我们很难从当前图层返回上一层图层。于是我实现的方法是,设置重绘函数 paint(),每当进行完撤销操作后就清空画布并重绘整个 Dolist

3.4 对话框设计

  • 保存、打开和文本输入时,需要从用户处得到字符串。
Load(JFrame prentFrame, String title, Stack<Shape> shapes, Main panel )
{super(prentFrame, title, true );this.shapes = shapes;this.panel = panel;JPanel p1 = new JPanel();JLabel label = new JLabel("请输入文本:");p1.add(label);text = new JTextField(30);text.addActionListener(this);p1.add(text);getContentPane().add("Center", p1);JPanel p2 = new JPanel();p2.setLayout(new FlowLayout(FlowLayout.RIGHT));JButton cancelButton = new JButton("取 消");cancelButton.addActionListener(this);button = new JButton("确 定");button.addActionListener(this);p2.add(button);p2.add(cancelButton);getContentPane().add("South", p2);pack();
}
  • 效果如下:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/ACn8bwOZ.shtml

相关文章

linux画板软件下载,Drawing画图软件

Drawing Linux(简单画图软件)让Linux用户有像win画图工具一样的体验&#xff0c;Linux下一款简单的绘图程序&#xff0c;类似Windows自带的画图&#xff0c;支持PNG&#xff0c;JPEG和bmp文件&#xff01; 软件介绍 该应用程序是一个基本的图像编辑器&#xff0c;类似于Microso…

【软考-软件设计师】(下午题).

【软考-软件设计师】(下午题). 一&#xff0c;数据流图 二&#xff0c;数据库 三&#xff0c;UNL 四&#xff0c;算法题 &#xff0c;c语言 五&#xff0c;c / java &#xff0c;程序填空 数据流图 数据流图基本概念 数据流图&#xff1a;没有联系&#xff08;&#xff09; …

基于JavaSwing开发画图软件 课程设计 小作业 大作业源码

基于JavaSwing开发画图软件&#xff08;大作业/课程设计&#xff09; 开发环境: Windows操作系统 开发工具&#xff1a;MyEclipse/eclipse/ideaJdk 运行效果图&#xff1a; 基于JavaSwing开发画图软件&#xff08;大作业/课程设计&#xff09; 开发环境: Windows操作系统 开…

2 画图软件 界面设计

打开Qt creator新建项目 &#xff08;1&#xff09;选择Qt控件项目–> Qt Gui应用&#xff08;为了适合新手我尽量附图&#xff09; &#xff08;2&#xff09;点击确定后出现项目名称和创建路径大家自己选择喽。我起的名称是pen 然后一直点击下一步就好了我们双击界面…

画图工具的认识及应用计算机,认知画图软件教学设计

认知画图软件教学设计 引导语&#xff1a;教学设计有利于教师主导作用的发挥&#xff0c;有利于按教学目标的要求来组织教学。以下是百分网小编整理的两篇不同的认知画图软件的教学设计&#xff0c;以供参考学习&#xff0c;欢迎阅读! 设计一 教学目的与要求 1、学会进入与正常…

计算机画图软件教学教案,画图软件教学设计

画图软件教学设计 学会用作图软件作图很重要!下面是百分网小编收集整理的画图软件教学设计&#xff0c;希望可以帮助到你! [教学目标] (1)学会进入与正常退出Windows 98的“画图”窗口。 (2)认识Windows 98“画图”窗口的组成。 (3)初步认识绘图工具箱。 [课时安排]1课时。 [教…

盘点年度最佳10大顶级绘图软件,满足你99%的图表需求,赶紧收藏

有效的沟通&#xff0c;从来都不是字数与数据的堆砌&#xff0c;有时一张图表的价值远高于成千的文字描述&#xff0c;将复杂的信息讲明白&#xff0c;便于浏览&#xff0c;让人一目了然就是信息视觉化的最佳效果。 老李我刚开始工作的时候&#xff0c;习惯什么都直接放上数据&…

dind(docker in docker)镜像-使用Docker学习Docker

文章目录 使用Docker学习Docker一、搭建演示环境二、关联基础docker image 文件系统什么是image layerDockerfile VOLUME&#xff08;数据卷&#xff09; 指令Volume命令的使用 什么是container-diff使用 三、演示时间探索 docker create 命令探索 docker start 命令探索 docke…

Docker学习1 - Docker

Docker 在部署中的重要性 直接把程序安装或部署在Linux操作系统上面&#xff0c;很容易引发资源冲突程序卸载不干净&#xff0c;导致无法安装或部署新程序每次部署之前要安装很多软件&#xff0c;修改复杂的配置文件无法让服务器硬件资源实现多租户服务增大了在Linux系统上部署…

Docker学习记录-01

Docker 的基本组成 镜像(image): 好比一个模板,tomcat -> run -> tomcat01 (container) 镜像可以创建多个容器 容器(container): 容器可以启动&#xff0c;停止&#xff0c;删除&#xff0c;基本命令 容器就是一个简易的Linux系统 仓库(repository)&#xff1a; 存…

docker学习之Ubuntu系统部署docker

目录 安装环境&#xff1a; 支持安装docker的Ubuntu操作系统版本 卸载旧版本的docker 安装docker所需要的依赖包 添加Docker的官方GPG密钥&#xff1a; 设置docker的镜像仓库 安装docker引擎 测试docker 卸载Docke ​​​​安装完毕。 安装环境&#xff1a; Linux系…

Docker学习2

文章目录 Docker学习Docker镜像是什么特点Docker镜像commit操作补充 Docker容器数据卷是什么能干嘛数据卷容器内添加 数据卷容器 DockerFile解析是什么DockerFile构建过程解析基础知识Docker执行DockerFile的大致流程 DockerFile体系结构&#xff08;保留字指令&#xff09;Doc…

Docker学习自我总结(一)

以下内容皆参考至狂神说docker学习视频 一、初识dockerfile ​ docker镜像创建时需要使用dockerfile&#xff0c;dockerfile相当于一个命令脚本&#xff0c;通过这个脚本可以生成镜像&#xff0c;镜像是一层一层的&#xff0c;脚本一个个的命令&#xff0c;每个命令都是一层&…

Docker 学习笔记

Docker 学习笔记 Docker 安装CentOS 安装 DockerUbuntu 安装 Docker Docker 常用命令 Docker 实操记录Docker 安装mysqlDocker 部署 jupyter notebook Docker 安装 CentOS 安装 Docker 以下是docker官网的安装教程&#xff0c;我只是将命令都提取出来 按下列顺序逐步输入即可…

docker 学习

centos7安装docker 步骤 1、Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。 社区版按照stable和edge两种方式发…

docker学习1

1.docker常用管理命令 格式 docker image 【】 ls 列出镜像 bulid 构建镜像利用dockerfile history 查看 inspect 显示一个或多个镜像的详细信息 pull 从镜像仓库拉取镜像 rm 移除一个或多个镜像 push 推送一个镜像到镜像仓库 prune 移除没有被…

docker 学习总结

只要学不死&#xff0c;就往死了学。 docker学习目录 docker概述docker安装docker基本组成 镜像命令容器命令操作命令 docker镜像容器数据卷dockerFiledocker 网络原理IDEA整合dockerdocker composerdocker swarmcI\cd docker概述 痛点&#xff1a;解决跨平台&#xff0c;服…

Docker学习总结

Docker学习总结 一、Docker简介二、Docker安装2.1 安装步骤2.2 卸载Docker2.3 配置阿里云镜像加速 三、Docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他常用命令 四、Dockerfile4.1 DockerFile简介4.2 DockerFile体系结构(保留字指令)4.3 案例4.3.1 Base镜像(scra…

Docker学习

理念&#xff1a;一次镜像&#xff0c;处处运行。是基于go语言实现的云开源项目 容器与虚拟机的区别&#xff1a; 虚拟机是一种带环境安装的解决方案&#xff0c;可以在一种操作系统中运行另外一种操作系统。 容器不是模拟一整个操作系统&#xff0c;而是只有软件所需要的库资…

一文带你入门docker

✅作者简介&#xff1a;我是18shou&#xff0c;一名即将秋招的java实习生 &#x1f525;系列专栏&#xff1a;牛客刷题专栏 &#x1f4c3;推荐一款模拟面试、刷题神器&#x1f449; [在线刷题面经模拟面试](在线面试刷题) 目录 安装Docker 卸载旧版本 Docker初装命令 Dock…