摘要

根据Windows自带的画图工具,进行简单的仿照,运行后用户可以实现简单的绘画,例如画三角形、多边形、矩形、曲线、直线,用户还可以根据需要选择喜欢的颜色进行绘画,并做到改变窗口大小或最小化窗口后重新打开时图案不消失

该程序主要应用java语言设计,开发软件为eclipse。

关键词:JAVA  eclipse  画图工具

第一章 概述

1.1引言

该画图板在图形界面下可以画直线,曲线,矩形,多边形,填充颜色基本功能。

对于绝大多数微机用户来讲,用电脑画图始终是个令人头疼的问题,尽管许多常用的文字处理软件都有绘图功能,但是使用这些软件作图却费时费力,效果不佳。一个图形往往会被操作者画的七零八落。为此设计一个画图工具,简洁快速地画出规整漂亮的图形来。

1.2系统目标

巩固和加深以Java语言为基础的面向对象编程技术理论知识的理解,提高实际动手编程能力的培养,掌握以Java为核心的应用软件开发方案,达到能独立阅读、编制和调试一定规模的Java程序的水平,程序通过调用JAVA提供的基本类进行了简单的界面设计,运用了JAVA中类的继承特性实现了对父类方法的调用及方法,并利用Switch-case语句保存相应的图形数据。

第二章 需求分析

2.1功能分析

设计一个画图工具,能够实现画图工具、画直线、画曲线、画多边形、画三角形等功能,并且在绘图过程中能够改变画笔颜色。

2.2系统的开发运行环境

本系统集成开发环境:Eclipse

本系统运行环境:Windows xp或以上版本

本系统开发语言:java

第三章 总体设计

3.1系统体系结构设计

本程序一共包含三个类,第一个类为drawframe类。其中包括的程序段有:

_draw():构造函数

setLayout(new BorderLayout()):设置面板布局

setBackground(Color.GREEN):设置面板颜色程序段

add(panel,BorderLayout.NORTH):添加面板到边框布局的上方

addActionListener(butt):添加按钮监听器

setBackground(color[i]):设置颜色程序段

addMouseListener(butt):添加鼠标监听器

第二个类为listener1类,第三个类为Shape类。

3.2系统功能模块及主要类设计

画板主要由以下几个部分组成:

3.2.1主窗体的设计

Drawframe类用来生成主界面,完成画图板的主要框架。主界面由菜单栏和画图区域三部分组成,布局采用borderlayout布局形式。

3.2.2菜单栏的设计

菜单栏为用户所要绘画的图形名称及颜色

第四章 详细设计与实现

4.1界面设计

创建一个drawframe类,继承JPanel类,重写JPanel的绘制方法,重写方法时写上原有的绘制方法,再添加绘制已有的图形的方法。(为了在改变窗口大小和最小化窗口后再打开时图案不消失)。

在画图方法中首先创建一个窗体,设置好各项参数,将窗体设置边框布局。由于继承了JPanel类,重写的JPanel的绘制方法对于this生效,所以this为画图部分的面板,将this设置一个背景色并放在边框布局的上方。

创建监听器类Listener1和监听对象。创建字符串数组存放画图形状的名称,用for循环,将字符串添加到各个按钮上,再将按钮添加到面板对象中,最后再给按钮加上按钮监听器。接着在创建颜色类的数组存放各种颜色,用for循环,将颜色设置成按钮的背景色,再将按钮添加到边框布局上方的面板对象中,再给按钮添加监听器。最后再在面板上获取画笔并添加鼠标监听器。

运行界面下图

4.2画图方法设计

创建Listener类。Listener类实现ActionListener,MouseListener,MouseMotionListener的接口。Listener类需要重写这些监听器接口的所有方法。

首先是点击按钮监听方法的重写,获取按钮上的字符串,如果是空字符串则将监听器内的画笔颜色设置为按钮颜色,如果是绘图方法的字符串,则另全局变量i重置为0(在切换画图方法时可重置数据)。

4.2.1画线方法:

若字符串为画线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2.再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段。最后保存画图形状,x1,y1,x2,y2和画笔颜色的数据到Shape类中的shape数组。

4.2.2画三角形方法:

若字符串为三角形,且全局变量i=0,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时将i++。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,分别画出该点与线段两个端点的连线,再将i重置为0(为画下一个三角形做准备)。最后再保存图形的相应数据到shape数组。

4.2.3画矩形方法:

若字符串为画矩形,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画矩形方法,传入参数x1,x2中较小的数,y1,y2中较小的数(较小的数作为矩形的左上方点的坐标),x1-x2的绝对值(矩形长度),y1-y2的绝对值(矩形高度)。最后再保存图形的相应数据到shape数组。

4.2.4画多边形的方法:

若字符串为画多边形,且全局变量i=0(判断是否为画多边形的第一步),则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1;在鼠标释放监听方法中获取鼠标释放的坐标点x,y并赋值给全局变量x2,y2。再用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段并保存这条线段的数据同时将i++(避免之后的点击动作重置x1,y1和x2,y2)。接着在鼠标点击方法中获取鼠标点击的坐标点x,y并赋值给全局变量x3,y3,再用画笔对象调用画线方法,画出x2,y2与x3,y3的连线同时保存这条线段的数据,接着将x3,y3赋值给x2,y2(为画下一条连线做准备)。同时设置若双击则将此点和x1,y1连接并保存这条线段的数据,最后再将i重置为0(为画下一个多边形做准备)。

4.2.5画曲线的方法:

若字符串为画曲线,则在鼠标按压监听方法中获取鼠标按压下的坐标点x,y并赋值给全局变量x1,y1,再在鼠标拖拽方法中获取鼠标所在点的坐标x2,y2,并用画笔对象调用画线方法,将x1,y1,x2,y2参数传入画出线段同时保存这条线段的数据。再将x2,y2赋值给x1,y1。最后再添加获取面板画笔的方法和返回shape数组的方法(在外部使用)。

程序代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JTextArea;public class drawframe extends JPanel{
public static void main(String[] args) {drawframe dr=new drawframe();
dr._draw();
}
private Shape[] shape;
public void _draw() {JFrame jf=new JFrame();//实例化jf.setSize(800,800);jf.setTitle("画图窗口");jf.setLocationRelativeTo(null);//使窗口居中jf.setDefaultCloseOperation(3);//关闭图标,程序会怎样处理jf.setLayout(new BorderLayout());//设置边框布局JPanel panel=new JPanel();//创建一个面板对象panel.setBackground(Color.GREEN);jf.add(panel,BorderLayout.NORTH);//添加到边框布局的上方Listener1 butt=new Listener1();//创建监听器类,并创建一个监听器对象String[] str= {"画线","画三角形","画矩形","画多边形","画曲线"};//创建字符串数组存储按钮文字for(int i=0;i<str.length;i++) {JButton jbu=new JButton(str[i]);//创建按钮对象并把按钮文字添加上panel.add(jbu);//将按钮添加到面板对象上jbu.addActionListener(butt);//给按钮添加监听器}Color[] color= {Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,Color.YELLOW,new Color(104,150,144)};//创建颜色数组存储画笔颜色for(int i=0;i<color.length;i++) {JButton jbu=new JButton();//创建按钮对象jbu.setBackground(color[i]);//将按钮背景设置颜色panel.add(jbu);//将按钮添加到面板对象上jbu.setPreferredSize(new Dimension(30,30));//设置按钮大小jbu.addActionListener(butt);//给按钮添加监听器}this.setBackground(Color.WHITE);//将继承来的面板设置背景色jf.add(this,BorderLayout.CENTER);//将此面板添加到边框布局的中央jf.setVisible(true);Graphics g=this.getGraphics();//在要绘画的面板上获取画笔(要在窗口可视化之后)butt.setg(g);//将画笔传入监听器this.addMouseListener(butt);//给要绘画的面板添加鼠标监听器this.addMouseMotionListener(butt);//给要绘制的面板添加鼠标监听器shape=butt.get();//将监听器内保存的图形保存到此类的全局变量中
}public void paint(Graphics g) {super.paint(g);//父类的绘画方法for(int i=0;i<shape.length;i++) {if(shape[i]!=null) {shape[i].drawshape(g);//图形的绘画}}}
}package java包;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;import javax.swing.JButton;public class Listener1 implements ActionListener,MouseListener,MouseMotionListener{private Graphics g;int x1,y1,x2,y2,x3,y3,i=0,j=0;String str;Shape[] shape=new Shape[10000];public Shape[] get() {return shape;//返回保存的图形数组}public void setg(Graphics g) {this.g=g;//获取外部画笔}public void actionPerformed(ActionEvent e) {if("".equals(e.getActionCommand())) {JButton jb=(JButton)e.getSource();Color color=jb.getBackground();g.setColor(color);//若为颜色按钮则设置画笔颜色}else {str=e.getActionCommand();//若为绘画方法按钮则获取按钮上字符串i=0;//切换绘画方法时重置数据}}public void mouseDragged(MouseEvent e) {if(str=="画曲线") {x2=e.getX();y2=e.getY();g.drawLine(x1,y1,x2,y2);shape[j++]=new Shape("画曲线",x1,y1,x2,y2,0,0,g.getColor());x1=x2;y1=y2;}}public void mouseMoved(MouseEvent e) {// TODO Auto-generated method stub}public void mouseClicked(MouseEvent e) {if("画三角形"==str) {x3=e.getX();y3=e.getY();g.drawLine(x1, y1, x3, y3);g.drawLine(x2, y2, x3, y3);i=0;//为画下一个三角形做准备shape[j++]=new Shape("画三角形",x1,y1,x2,y2,x3,y3,g.getColor());}if("画多边形"==str) {x3=e.getX();y3=e.getY();g.drawLine(x3, y3, x2, y2);shape[j++]=new Shape("画多边形",x2,y2,x3,y3,0,0,g.getColor());x2=x3;y2=y3;if(e.getClickCount()==2) {g.drawLine(x1, y1, x2, y2);shape[j++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor());i=0;//为画下一个多边形做准备}}}public void mousePressed(MouseEvent e) {if("画线"==str) {x1=e.getX();y1=e.getY();}if("画三角形"==str) {//判断为画三角形的第一步if(i==0) {x1=e.getX();y1=e.getY();}}if("画矩形"==str) {x1=e.getX();y1=e.getY();}if("画多边形"==str) {//判断为画多边形的第一步if(i==0) {x1=e.getX();y1=e.getY();}}if("画曲线"==str) {x1=e.getX();y1=e.getY();}}public void mouseReleased(MouseEvent e) {if("画线"==str) {x2=e.getX();y2=e.getY();g.drawLine(x1,y1,x2,y2);shape[j++]=new Shape("画线",x1,y1,x2,y2,0,0,g.getColor());}if("画三角形"==str) {//判断为画三角形的第一步if(i==0) {x2=e.getX();y2=e.getY();g.drawLine(x1,y1,x2,y2);i++;//避免在点击时重置已有的坐标值}}if("画矩形"==str) {x2=e.getX();y2=e.getY();g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));shape[j++]=new Shape("画矩形",x1,y1,x2,y2,0,0,g.getColor());}if("画多边形"==str) {//判断为画多边形的第一步if(i==0) {x2=e.getX();y2=e.getY();g.drawLine(x1,y1,x2,y2);i++;//避免在点击时重置已有的坐标值shape[j++]=new Shape("画多边形",x1,y1,x2,y2,0,0,g.getColor());}}}public void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}
package java包;
import java.awt.Color;
import java.awt.Graphics;public class Shape {private String name;private int x1,y1,x2,y2,x3,y3;//定义成员变量private Color m;public Shape(String name,int x1,int y1,int x2,int y2,int x3,int y3,Color m) {this.name=name;//避免成员变量与局部变量重名。this.x1=x1;this.x2=x2;this.y1=y1;this.y2=y2;this.x3=x3;this.y3=y3;this.m=m;}public void drawshape(Graphics g) {g.setColor(m);switch(name) {case "画线":g.drawLine(x1,y1, x2, y2);break;case "画三角形":g.drawLine(x1, y1, x2, y2);g.drawLine(x1, y1, x3, y3);g.drawLine(x3, y3, x2, y2);break;case "画矩形":g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));break;case "画多边形":g.drawLine(x1,y1, x2, y2);break;case "画曲线":g.drawLine(x1,y1, x2, y2);break;}}
}

Java课程设计-画图工具相关推荐

  1. ATM柜员机JAVA课程设计_ATM柜员机学年论文设计(Java课程设计)

    内容简介: ATM柜员机学年论文设计(Java课程设计),共23页,4599字,附源程序. 一. 程序介绍3 二. 开发环境搭建3 1. MyEclipse 5.5.1 GA安装3 2. MyEcli ...

  2. java课程设计 考试系统,java课程设计考试系统.

    java课程设计考试系统.Tag内容描述: 1.目 录 第一章第一章 引言引言 3 1 1目的 3 1 2名词解释 3 1 3参考资料 3 1 4文档结构 3 第第 2 章章远景远景 4 2 1项目概 ...

  3. Java课程设计报告--绩效考核信息管理系统

     Java课程设计报告 题目      绩效考核信息管理系统    学生姓名         学    号                   院    系        年级专业计算机科学与技术 班 ...

  4. java课程设计心得体会绪论

      java课程设计心得体会绪论[篇1] 在上学期的最后一周和本学期的第一周,我和同组的学员在学校机房进行了JAVA暑期实训,现在已经结束了. 回首上学期的java学习,重点还是在学习概念等一些常识性 ...

  5. java课程设计atm机_java课程设计报告-自动取款机模拟程序.doc

    java课程设计报告-自动取款机模拟程序.doc 还剩 53页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: } ...

  6. 秒表计时器——Java基础练手项目(Java课程设计)

    前言:鄙人是大二在读学生,大二上学期Java课程设计选了一个秒表计时器的题目,在此把代码和心得分享出来(懒人可以直接看PPT).鄙人资历尚浅,代码中会有许多不当之处,望各位大佬海涵,有更好的建议希望各 ...

  7. java设计火车的类,JAVA课程设计--火车票管理系统

    JAVA课程设计--火车票管理系统 ******************* 实践教学实践教学 ******************* 兰州理工大学兰州理工大学 计算机与通信学院 2013 年秋季学期 ...

  8. java学籍管理系统课设报告,java课程设计学籍管理系统.doc

    java课程设计学籍管理系统.doc 课程设计任务书题目学籍管理系统组员学号组员学号组员学号专业课程JAVA指导教师完成时间2011年9月2011年12月计算机科学系制1课程设计任务书及成绩评定课程设 ...

  9. Java课程设计——挖地雷游戏设计报告

    源文件: 大学生Java课程设计--挖地雷游戏设计报告源文件-其它文档类资源-CSDN文库 目 录 摘 要. 1 一.引言. 2 1.设计任务和基本要求. 2 二.报告正文. 3 1.需求分析. 3 ...

最新文章

  1. cacti邮件告警设置
  2. [LeetCode] Intersection of Two Linked Lists 求两个链表的交点
  3. 【转】大型网站系统架构演化之路
  4. 无极菜单 php,ThinkPHP菜单无极分类 ThinkPHP菜单无极分类实例讲解
  5. 2018.08.02 hdu1558 Segment set(并查集+计算几何)
  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love max and multiply(转化)
  7. js 用submit()方法提交表单,页面闪退问题以及解决方法
  8. 【java】java 并发编程 ArrayBlockingQueue
  9. 20200221:在排序数组中查找元素的第一个和最后一个位置(leetcode34)
  10. 在Android中查看和管理sqlite数据库
  11. 如何使用.NET清除IE的缓存(Temporary Internet Files)
  12. 材料之kube-dns.yaml
  13. PID控制算法介绍与C程序实现
  14. MSAgent技术应用
  15. 行政界线类型代码_行政区划代码的代码表
  16. 王道训练营3月12日
  17. 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
  18. Hazel引擎学习(三)
  19. 粉丝经济大爆发居然真的来了
  20. 数字存储示波器基本工作原理与使用方法

热门文章

  1. Spring Cloud zuul自定义异常信息
  2. 【java】关于java编程语言开发
  3. 接收Cookie总结
  4. 将cookie字符串转成editthiscookie插件的json格式
  5. 基于51单片机的篮球计时计分器仿真原理图PCB方案设计
  6. 魔方机器人(一)还原算法
  7. vxlan专题---第四章配置分布式网关部署方式的华为VXLAN示例-外部路由type5
  8. JOOQ初体验-SpringBoot集成JOOQ
  9. smart-link/monitor-link
  10. 【烧写Uboot到SD卡,打开 SD-bl1-8k.bin 失败,failed to open‘SD-bl1-8k.bin】