Java课程设计-画图工具

摘要

根据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;
 }
 }
}

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-MTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值