Java课程设计报告
题目: 一个简单的绘画板
班级:
学号:
姓名:
指导老师:
完成起止日期: 20##年12月7日 —— 20##年12月26日
目录
1、题目与要求······································ 3
1.1、题目········································ 3
1.2、参考文献···································· 3
2、功能描述········································ 4
3、设计思想与系统结构·······························5
3.1、类设计·······································5
3.2、结构图·······································6
4、用户界面·········································7
5、代码分析·········································8
6、实验总结·········································19
课程设计题目与要求
1.1 .课题题目
参考Windows附件中的绘图工具,使用Java语言设计并实现一个简单的绘图板。(界面使用AWT或SWING)
a) 实现各类基本图形的编辑
b) 实现文件的保存和读取功能。
1.2 .参考文献
1.《java编程思想》,机械工业出版社,1999年4月
2.《java项目设计与开发范例》,电子工业出版社,20##年4月,唐小军等
3.《java开放源码编程》,电子工业出版社,20##年1月,沃纳斯
4.《java程序设计》,清华大学出版社,20##年8月,雍俊海
功能描述
a) 画笔功能
程序实现画笔功能,可以拖动鼠标画任意曲线,曲线颜色可从调试板选择。
b) 直线功能
程序实现画直线功能,可以以任意点为起点,拖动鼠标画任意长的线段,线段颜色可由调试板选择。
c) 矩形功能
程序实现画矩形功能,可以以任意点为矩形的左上角端点,拖动鼠标画任意矩形,矩形颜色可由调试板选择。
d) 椭圆功能
程序实现画椭圆功能,可以以任意点为椭圆的左端边界,画任意椭圆,椭圆颜色可由调试板选择。
e) 调色板功能
程序实现调试板功能,可以选择画笔的颜色和填充图形的颜色。
f) 清除功能
程序实现清除画板功能,可以清除以前在画板上画的所有图形。
g) 文件保存
程序实现文件保存功能,可以保存画图文件,可以在以后继续编辑。
h) 文件打开
程序实现打开以前保存的画图文件的功能,可以打开以前保存的图片,继续编辑。
设计思想与系统结构
3.1.类设计
图3.1
3.2.结构图
图3.2
用户界面
图4.1
操作:画直线,曲线,圆,椭圆,矩形
图4.2
代码分析
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.awt.geom.*;
import java.io.*;
public class Painting {
public static void main(String args[]){
new paintboard("画板");
}
}
/**点*/
class Point implements Serializable //对象序列化接口
{
int x,y; //点坐标
Color col; //颜色
int tool; //工具类型
int boarder; //边界
Point(int x, int y, Color col, int tool, int boarder)
{
this.x = x;
this.y = y;
this.col = col;
this.tool = tool;
this.boarder = boarder;
}
}
/**画板*/
class paintboard extends Frame implements ActionListener,MouseMotionListener,MouseListener,ItemListener
{
int x = -1, y = -1;
int con = 1;//画笔大小
int Econ = 5;//橡皮大小
int toolFlag = 0;//toolFlag:工具标记
/**toolFlag工具对应表:
(0--画笔);(1--橡皮);(2--清除);
(3--直线);(4--圆);(5--矩形);
(6--撤销) */
Color c = new Color(0,0,0); //画笔颜色
BasicStrokesize=newBasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //画笔粗细
Point cutflag = new Point(-1, -1, c, 6, con);//截断标志
Vector paintInfo = null;//点信息向量组
int n = 1;
FileInputStream picIn = null;
FileOutputStream picOut = null;
ObjectInputStream VIn = null;
ObjectOutputStream VOut = null;
// *工具面板--画笔,直线,圆,矩形,橡皮,清除*/
Panel toolPanel; //画板组件
JButton eraser, drLine,drCircle,drRect; //橡皮,画线,画圆,画矩形
JButton clear ,pen; //清除,铅笔
Choice SizeChoice,EraserChoice; //选择颜色,选择画笔大小,选择橡皮大小
JButton colchooser; //调色板
Label 大小B,大小E;
//保存功能
JButton openPic,savePic; //打开,保存按钮
FileDialog openPicture,savePicture; //打开,保存对话框
paintboard(String s)
{
super(s);
addMouseMotionListener(this);
addMouseListener(this);
paintInfo = new Vector(); //点信息向量组
/*各工具按钮及选择项*/
//画笔大小选择
SizeChoice = new Choice();
SizeChoice.add("1");
SizeChoice.add("3");
SizeChoice.add("5");
SizeChoice.add("7");
SizeChoice.add("9");
SizeChoice.add("11");
SizeChoice.add("15");
SizeChoice.add("19");
SizeChoice.addItemListener(this); //事件监听
//橡皮大小选择
EraserChoice = new Choice();
EraserChoice.add("2");
EraserChoice.add("5");
EraserChoice.add("9");
EraserChoice.add("13");
EraserChoice.add("17");
EraserChoice.add("21");
EraserChoice.add("25");
EraserChoice.addItemListener(this); //事件监听
toolPanel = new Panel();
Color bc=new Color(0,255,0);//JButton背景色
clear = new JButton("清除");//清除
//clear.setIcon(clearicon);
clear.setBackground(bc);
eraser = new JButton("橡皮");
eraser.setBackground(bc);
pen = new JButton("画笔");//画笔
//pen.setIcon(penicon);
pen.setBackground(bc);
drLine = new JButton("直线");
drLine.setBackground(bc);
drCircle = new JButton("圆形");
drCircle.setBackground(bc);
drRect = new JButton("矩形");
drRect.setBackground(bc);
openPic = new JButton("打开");//打开
//openPic.setIcon(openicon);
openPic.setBackground(bc);
savePic = new JButton("保存"); //保存
//savePic.setIcon(saveicon);
savePic.setBackground(bc);
colchooser = new JButton("调色板");
colchooser.setBackground(bc);
//各组件事件监听
clear.addActionListener(this);
eraser.addActionListener(this);
pen.addActionListener(this);
drLine.addActionListener(this);
drCircle.addActionListener(this);
drRect.addActionListener(this);
openPic.addActionListener(this);
savePic.addActionListener(this);
colchooser.addActionListener(this);
Color lc=new Color(150,150,150);
//颜色 = new Label("画笔颜色",Label.CENTER);
//颜色.setBackground(lc);
大小B = new Label("画笔大小",Label.CENTER);
大小B.setBackground(lc);
大小E = new Label("橡皮大小",Label.CENTER);
大小E.setBackground(lc);
//面板添加组件
toolPanel.add(pen); //画笔
toolPanel.add(drLine); //画直线
toolPanel.add(drCircle); //画圆
toolPanel.add(drRect); //画矩形
toolPanel.add(大小B);//画笔大小标签
toolPanel.add(SizeChoice); //画笔大小选项
toolPanel.add(colchooser); //调色板
toolPanel.add(eraser); //橡皮按钮
toolPanel.add(大小E); //橡皮大小标签
toolPanel.add(EraserChoice); //橡皮大小选项
toolPanel.add(clear); //清除
toolPanel.add(openPic); //打开
toolPanel.add(savePic); //保存
//工具面板添加到APPLET面板
add(toolPanel,BorderLayout.NORTH);
setBounds(0,0,1000,700);//画板边界大小
setVisible(true);
validate();
openPicture = new FileDialog(this,"打开",FileDialog.LOAD); //文件打开对话框
openPicture.setVisible(false);
savePicture = new FileDialog(this,"保存",FileDialog.SAVE); //文件保存对话框
savePicture.setVisible(false);
openPicture.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{openPicture.setVisible(false); }
}
); //打开窗口事件监听
savePicture.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{ savePicture.setVisible(false); }
}); //保存窗口事件监听
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);}
}); //主程序窗口事件监听
}
/**画图*/
public void paint(Graphics g)
{
Graphics2D g2d = (Graphics2D)g; //二维图形
Point p1,p2; //点
n = paintInfo.size(); //点的个数
if(toolFlag==2)
g.clearRect(0,0,getSize().width,getSize().height);//清除画板内容
for(int i=0; i<n ;i++){
p1 = (Point)paintInfo.elementAt(i);
p2 = (Point)paintInfo.elementAt(i+1);
size = new BasicStroke(p1.boarder,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
g2d.setColor(p1.col);
g2d.setStroke(size);
if(p1.tool==p2.tool) //判断点的类型
{
switch(p1.tool)
{
case 0://画笔
Line2D line1 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
g2d.draw(line1);
break;
case 1://橡皮
g.clearRect(p1.x, p1.y, p1.boarder, p1.boarder);
break;
case 3://画直线
Line2D line2 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
g2d.draw(line2);
break;
case 4://画圆
Ellipse2D ellipse = new Ellipse2D.Double(p1.x, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y));
g2d.draw(ellipse);
break;
case 5://画矩形
Rectangle2D rect = new Rectangle2D.Double(p1.x, p1.y, Math.abs(p2.x-p1.x) , Math.abs(p2.y-p1.y));
g2d.draw(rect);
break;
case 6://截断,跳过
i=i+1;
break;
default :
}//end switch
}//end if
}//end for
}
/**事件处理*/
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==SizeChoice)//画笔大小
{
String selected = SizeChoice.getSelectedItem();
if(selected=="1")
{
con = 1;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="3")
{
con = 3;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="5")
{con = 5;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="7")
{con = 7;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="9")
{con = 9;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="11")
{con = 11;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="15")
{con = 15;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
else if(selected=="19")
{con = 19;
size = new BasicStroke(con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
}
}
else if(e.getSource()==EraserChoice)//橡皮大小
{
String Esize = EraserChoice.getSelectedItem();
if(Esize=="2")
{ Econ = 2*2; }
if(Esize=="5")
{ Econ = 5*2; }
else if(Esize=="9")
{ Econ = 9*2; }
else if(Esize=="13")
{ Econ = 13*2; }
else if(Esize=="17")
{ Econ = 17*2; }
else if(Esize=="21")
{ Econ = 21*2; }
else if(Esize=="25")
{ Econ = 25*2; }
}
}
/** 单击鼠标拖动 ,画笔,橡皮 */
public void mouseDragged(MouseEvent e)
{
Point p1 ;
switch(toolFlag){
case 0://画笔
x = (int)e.getX();
y = (int)e.getY();
p1 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p1);
repaint();
break;
case 1://橡皮
x = (int)e.getX();
y = (int)e.getY();
p1 = new Point(x, y, null, toolFlag, Econ);//用无色的点重新覆盖掉以前的点
paintInfo.addElement(p1);
repaint();
break;
default :
}
}
/**鼠标移动*/
public void mouseMoved(MouseEvent e) {}
/**更新*/
public void update(Graphics g)
{
paint(g);
}
/**单击鼠标拖动,画直线,画圆,画矩形*/
public void mousePressed(MouseEvent e)
{
Point p2;
switch(toolFlag){
case 3://直线
x = (int)e.getX();
y = (int)e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
case 4: //圆
x = (int)e.getX();
y = (int)e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
case 5: //矩形
x = (int)e.getX();
y = (int)e.getY();
p2 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p2);
break;
default :
}
}
/**鼠标释放*/
public void mouseReleased(MouseEvent e)
{
Point p3;
switch(toolFlag){
case 0://画笔
paintInfo.addElement(cutflag); //截断画笔
break;
case 1: //橡皮
paintInfo.addElement(cutflag); //截断橡皮
break;
case 3://直线
x = (int)e.getX();
y = (int)e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
case 4: //圆
x = (int)e.getX();
y = (int)e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
case 5: //矩形
x = (int)e.getX();
y = (int)e.getY();
p3 = new Point(x, y, c, toolFlag, con);
paintInfo.addElement(p3);
paintInfo.addElement(cutflag);
repaint();
break;
default:
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
/**动作事件处理*/
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==pen)//画笔
{toolFlag = 0;}
if(e.getSource()==eraser)//橡皮
{toolFlag = 1;}
if(e.getSource()==clear)//清除
{
toolFlag = 2;
paintInfo.removeAllElements();
repaint();
}
if(e.getSource()==drLine)//画线
{toolFlag = 3;}
if(e.getSource()==drCircle)//画圆
{toolFlag = 4;}
if(e.getSource()==drRect)//画矩形
{toolFlag = 5;}
if(e.getSource()==colchooser)//调色板
{
Color newColor = JColorChooser.showDialog(this,"调色板",c);
c = newColor;
}
if(e.getSource()==openPic)//打开图画
{
openPicture.setVisible(true);
if(openPicture.getFile()!=null)
{
int tempflag;
tempflag = toolFlag;
toolFlag = 2 ;
//paintInfo.removeAllElements();//移除所有点的信息
//repaint(); //清除画板内容
try{
paintInfo.removeAllElements();//移除所有点的信息
repaint(); //清除画板内容
File filein = new File(openPicture.getDirectory(),openPicture.getFile()); //打开文件
picIn = new FileInputStream(filein);
VIn = new ObjectInputStream(picIn);
paintInfo = (Vector)VIn.readObject(); //依次将文件中的点信息读入到点向量组中
VIn.close();
repaint(); //重绘点
toolFlag = tempflag;//工具类型恢复为载入文件之前的状态
}
catch(ClassNotFoundException IOe2) //捕获文件类型不正确异常
{
repaint();
toolFlag = tempflag;
System.out.println("can not read object");
}
catch(IOException IOe) //捕获文件无法读取异常
{
repaint();
toolFlag = tempflag;
System.out.println("can not read file");
}
}
}
if(e.getSource()==savePic)//保存图画
{
savePicture.setVisible(true);
try{
File fileout = new File(savePicture.getDirectory(),savePicture.getFile()); //保存文件
picOut = new FileOutputStream(fileout);
VOut = new ObjectOutputStream(picOut);
VOut.writeObject(paintInfo); //将点向量组中的点信息写入对象输出流
VOut.close();
}
catch(IOException IOe) //捕获文件写入异常
{
System.out.println("can not write object");
}
}
}
}//end paintboard
课程设计总结
作为一名计算机科学与技术专业的的学生,我觉得能做类似的课程设计是十分有意义,而且是十分必要的。在已度过的大三的时间里我们大多数接触的是专业基础课。我们在课堂上掌握的仅仅是专业基础课的理论面,如何去锻炼我们的实践能力?如何把我们所学到的专业基础理论知识用到实践中去呢?我想做类似的大作业就为我们提供了良好的实践平台。在做本次课程设计的过程中,我感触最深的当数查阅大量的书籍了。为了让自己的设计更加完善,更加符合软件工程标准,一次次翻阅各种参考资料是十分必要的,同时也是必不可少的。作为一名专业学生掌握一门或几门程序设计语言是必不可少的,由于本次课程设计要求用java进行开发,在这过程中我对各种的开发环境进行了探索并且在学习的过程中带着问题去学我发现效率很好,记得大一学c语言好难就是因为我们没有把自己放在使用者的角度,单单是为了学而学,这样效率当然不会高。边学边用这样才会提高效率,这是我作本次课程设计的又一个收获。但是由于本人水平有限,难免会有错误,还望老师批评指正。