摘要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
JAVA是一门很优秀的编程语言,具有面向对象、与平台无关、安全、稳定和多线程等特点,是目前软件设计中极为健壮的编程语言。
JAVA不仅可以用来开发大型的应用程序。
而且特别适合Internet的应用开发。
JAVA确实具备“一次写成,处处运行”的特点,JAVA以成为网络时代最重要的编程语言之一。
本报告中介绍了用JAVA语言实现画笔系统的全部过程。
本次课程设计是配合JAVA程序设计课程,帮助我们深入学习掌握JAVA语言,熟练运用这个工具来编写的。
通过课程设计各个项目的综合训练,培养学生实际分析问题、编程和动手能力、提高学生的综合素质。
本课程设计尝试使用一些较生动的示例和设计项目,激发学生学习兴趣,引导学生主动学习,正确理解、接受需要重点掌握的知识点,为参加项目开发及更深入学习做好准备。
本次课程设计主要是用JAVA实现画笔系统,其系统主要完成以下功能:设计一个画图程序,能够实现画笔、画直线、画圆形、画矩形、修改该画笔的大小以及颜色。
该画图程序还需具有橡皮擦功能以及清空整个画面的功能关键词:画图工具,JA V A目录摘要 (1)目录 (2)1.绪论 (3)2. 开发环境介绍 (4)3.需求分析 (5)3.1总体目标..................................... 错误!未定义书签。
3.2要实现的功能 (7)4.概要设计 (8)4.1设计准备 (8)4.2需要用到的类 (8)5.详细设计 (9)5.5类的设计 (9)5.2类的方法设计 (9)6.测试数据及运行结果 (8)7.总结 (15)8.参考文献 (15)9.源程序 (15)1.绪论Java不依赖平台的特点使它受到广泛的关注,Java已成为网络时代最重要的语言之一。
目前,Java语言不仅是一门被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。
因为很多新的技术领域都涉及到Java语言,国内外许多大学已将Java语言列入本科教学计划,而IT行业对Java人才的需求也在不断的增长,因此,掌握Java 已经成为共识。
Java是一门说简单也不简单,说难也不难的课程。
所以,我们在学习的过程中要根据自己的具体情况,合理安排编程训练时间,相信编程能力会在不知不觉中得到提高。
在此次的课程设计实践中,我学到了教科书上没有的东西。
这次课程设计,我按照课程设计的要求,分块实现程序的功能。
在实践中我遇到许多的问题,但我都克服,最终我成功的完成了这次课程设计。
从中我充分理解了Java面对对象的特性,并体会到Java与C语言的不同之处在实践的同时,我又从中成长了许多,特别是在对程序的编译和调试中掌握了许多的技巧和方法,为今后的其他计算机语言的学习奠定了一定的基础2. 开发环境介绍该项目所使用的软件开发环境如下:操作系统:Windows xp开发工具:eclipse3.2及其VE插件Eclipse简介Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括Java 开发工具。
Eclipse是著名的跨平台的自由集成开发环境(IDE)。
最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。
Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。
许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。
IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。
目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat 及Sybase等。
Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。
近期还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。
3.需求分析3.1要实现的功能(1)完成画线、画直线、画矩形、画圆及擦除(橡皮擦功能)(2)可以设置画笔颜色(3)可以设置画笔宽度(4)使用面向对象的方法4.1设计准备1、此程序为实现这些功能模块,必须首先定义一个工具面板,将这些画笔、画箭头、椭圆、圆、多边形直线、画矩形、画笔颜色、画笔大小、橡皮等功能组件放入这个工具面板中。
2、此程序为实现利用鼠标做画笔的功能,必会产生鼠标事件MouseEvent。
因此,为实现鼠标画图的功能,必须用到鼠标触发事件,故在此程序中,必须实现“委托事件模型”,用到事件源、事件对象以及监听者对象。
3、此程序中,必须用到的包如下:import java.awt.*;import javax.swing.*;import java.awt.event.*;4.2需用到的类1 )class Mycanvas此类用于定义一组数据成员,并且使用构造函数将他们分别初使化,以方便在下面的程序中使用他们。
2)class Myframe此类用于实现这个程序的大部分功能,在这个类中除了定义一些基本变量以及构造函数外,还定义了很多成员方法,这些成员方法将实现鼠标触发事件的一系列绘图功能。
3 )public class Text这个类是主类,是程序得以运行的入口。
在这个主类中定义了主方法,是该程序执行的入口。
5.1类的设计1) class Mycanvas在这个类中定义了用于截断的一系列标志变量,有初始坐标、颜色、工具选择等,并且在这个类中还定义了构造函数void setx1(int x1){ },用于完成对这些变量的初始化工作。
2) class Myframe这个类用来实现整个程序的大部分功能,并且在这个类中定义了大部分的成员函数和成员方法,在这个类中用到的主要成员方法如下:public void actionPerformed(ActionEvent e){}public void itemStateChanged(ItemEvent e){}public void mousePressed(MouseEvent e){}public void mouseRelesed(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}public void mouseDragged(MouseEvent e){}public void mouseMoved(MouseEvent e){}5.2类的方法介绍①定义的变量:在这个类中,首先定义了画笔的大小、画笔的颜色、画笔的粗细、橡皮的大小、工具的选择等一些变量,并且还用到了系统中自带的一些类初使化了一些面板工具对象,用于完成对面板工具、画直线、画椭圆、画矩形、橡皮擦、清除等一些工具按钮的定义。
②初使化构造函数:在这个初使化构造函数中,首先继承了父类Frame,然后初使化了各工具按钮以及各个选择项,包括颜色选择、画笔大小选择、橡皮大小选择,并且将这些组件添加到了工具面板中,最后还对各个组件注册了事件监听者对象。
③paint()方法:这个方法主要用于在Applet的界面中显示文字、图形和其它界面元素。
本程序中,在这个方法中,定义了一些工具选项设置,给用户选择画笔、画直线、画圆、橡皮擦等一些功能。
④itemStateChanged()方法:这个方法用来实现的功能很简单,主要是用来改变画笔大小、画笔颜色、橡皮大小的。
在此方法中,设置了大小以及颜色的一些预选项,以供用户对大小以及颜色做出选择。
⑤mouseDragged()方法:此方法是处理MouseEvent事件以实现MouseMotionListener接口的对象。
MouseMotionListener是事件监听者,mouseDragged(MouseEvent e)是成员方法,代表鼠标拖动事件,在这个方法中,还用到了MouseEvent类常用成员方法:public int getX()以及public int getY(),用来返回发生鼠标事件的X及Y的坐标。
这个方法中,主要用来控件画笔和橡皮的转换。
⑥mousePressed()方法:此方法是处理MouseEvent事件以实现MouseListener接口的对象。
MouseListener是事件监听者,mouseDPressed(MouseEvent e)是成员方法,代表鼠标按下事件。
这个方法主要用来控件用户画直线、画圆、画矩形这些功能之间的转换。
⑦ mouseReleased()方法:mouseEntered()方法:mouseExited()方法:mouseClicked()方法:这些方法和mousePressed()方法属于同一类,他主要用来表示鼠标释放事件,是对上述各个功能完成后对鼠标事件的又一次触发。
3、画直线、画圆、画矩形7.总结此软件基本达到理想效果,在编写这一软件的过程中我学到了很多java 编程知识,并学会了如何快速的改正程序中的错误。
在本次java课程设计中,我收获了很多。
特别是在编写java程序时,必须先对程序的功能进行初步的分析,得到程序中每一个功能所需要用到的方法或思路,同时根据功能的相似来设计一类功能的实现,并通过某些语句的改变达到多功能效果。
这次课程设计使我受益匪浅,锻炼了我做事坚持不懈的心态,也使我的自学能力也有了一定的提高,我更明白了搞计算机这行,要学到真正的技术完全要靠自己,在课堂上只能学到最基本的东西,但这最基本的东西也一定要学好。
8.参考文献《java2实用教程》耿祥于、张跃平编著清华大学出版社9.源程序package sdrc;import java.awt.*;import java.awt.event.*;import javax.swing.*;class Mycanvas extends Canvas {int x1,y1,x2,y2,x3,y3,r;int d=3;int huabi=1;double x[]=new double[8],y[]=new double[8];int x4[]=new int[8],y4[]=new int[8];Double X[]=new Double[8],Y[]=new Double[8];Color c;Mycanvas(){setBackground(Color.white);}void setx1(int x1){this.x1=x1;}void sety1(int y1){this.y1=y1;}void setx2(int x2){this.x2=x2;}void sety2(int y2){this.y2=y2;}void setx3(int x3){this.x3=x3;}void sety3(int y3){this.y3=y3;}void setcolor(Color c){this.c=c;}void setarc(int d){this.d=d;}void setr(int e){r=e;}void sethuabi(int huabi){this.huabi=huabi;}public void paint(Graphics g,int i){g.setColor(c);Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);if(i==1){g.drawOval(x1, y1, x2,y2);}else if(i==2){g.drawLine(x1, y1, x2, y2);}else if(i==3){g.drawRect(x1, y1, x2,y2);}}public void Paint(Graphics g){Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);for(int i=0;i<d;i++){X[i]=new Double(x[i]);x4[i]=X[i].intValue();Y[i]=new Double(y[i]);y4[i]=Y[i].intValue();}for(int i=0;i<d;i++){g.drawLine(x4[i%d],y4[i%d],x4[(i+1)%d],y4[(i+1)%d]);}}public void paintk(Graphics g) {g.setColor(c);Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);double H = 10 ;double L = 7 ;int x3 = 0 ;int y3 = 0 ;int x4 = 0 ;int y4 = 0 ;double awrad = Math.atan(L / H);double arraow_len = Math.sqrt(L * L + H * H);double [] arrXY_1 = rotateVec(x2 - x1, y2 - y1, awrad, true , arraow_len);double[] arrXY_2 = rotateVec(x2- x1, y2- y1, - awrad, true, arraow_len);double x_3 = x2 - arrXY_1[ 0 ]; // (x3,y3)是第一端点double y_3 = y2 - arrXY_1[ 1 ];double x_4 = x2 - arrXY_2[ 0 ]; // (x4,y4)是第二端点double y_4 = y2 - arrXY_2[ 1 ];Double X3 = new Double(x_3);x3 = X3.intValue();Double Y3 = new Double(y_3);y3 = Y3.intValue();Double X4 = new Double(x_4);x4 = X4.intValue();Double Y4 = new Double(y_4);y4 = Y4.intValue();// g.setColor(SWT.COLOR_WHITE);// 画线g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y2, x3, y3);g.drawLine(x2,y2,x4,y4);}public double [] rotateVec( int px, int py, double ang, boolean isChLen, double newLen) {double mathstr[] = new double [ 2 ];double vx = px * Math.cos(ang) - py * Math.sin(ang);double vy = px * Math.sin(ang) + py * Math.cos(ang);if (isChLen) {double d = Math.sqrt(vx * vx + vy * vy);vx = vx / d * newLen;vy = vy / d * newLen;mathstr[ 0 ] = vx;mathstr[ 1 ] = vy;}return mathstr;}}class Myframe extends Frame implements ActionListener,ItemListener,MouseListener, MouseMotionListener {Mycanvas canvas;Graphics g;int x, y, z, r;int p, q;int flag=0;int xiangpi=4;int huabi=1;Panel panel1, panel2, panel3;Label label1, label2, label3,label5,label6;Button b1, b2, b3, b4,b6,b7,b8,b9;TextField t1, t2, t3, t4,t5,t6,t7;Box baseBox, box1, box2, box3;Choice choice,choice2,choice3;Myframe() {super("画图工具");canvas = new Mycanvas();choice = new Choice();choice2 = new Choice();choice3 = new Choice();label1 = new Label("操作");label2 = new Label("参数");label3 = new Label("颜色");label5=new Label("橡皮擦"); label6=new Label("画笔"); panel1 = new Panel();panel2 = new Panel();panel3 = new Panel();b1 = new Button("圆");b2 = new Button("椭圆");b3 = new Button("直线");b4 = new Button("矩形");b6 = new Button("清除");b7= new Button("退出");b8=new Button("橡皮擦");b9=new Button("绘画");t1 = new TextField(5);t2 = new TextField(5);t3 = new TextField(5);t4 = new TextField(5); choice.add("红");choice.add("绿");choice.add("蓝");choice.add("黄");choice.add("青");choice.add("橙");choice.add("黑");choice2.add("4");choice2.add("10");choice2.add("20");choice2.add("50");choice2.add("100");choice2.add("200");choice3.add("1");choice3.add("3");choice3.add("8");choice3.add("10");choice3.add("13");choice3.add("16");b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b6.addActionListener(this); b7.addActionListener(this); b8.addActionListener(this); b9.addActionListener(this);choice.addItemListener(this);choice2.addItemListener(this);choice3.addItemListener(this);box1 = Box.createHorizontalBox();box1.add(label1);box1.add(Box.createHorizontalStrut(4)); box1.add(b1);box1.add(Box.createHorizontalStrut(8)); box1.add(b2);box1.add(Box.createHorizontalStrut(8)); box1.add(b3);box1.add(Box.createHorizontalStrut(8)); box1.add(b4);box2 = Box.createHorizontalBox();box2.add(label2);box2.add(Box.createHorizontalStrut(8)); box2.add(t1);box2.add(Box.createHorizontalStrut(5)); box2.add(t2);box2.add(Box.createHorizontalStrut(5)); box2.add(t3);box2.add(Box.createHorizontalStrut(5)); box2.add(t4);box3 = Box.createHorizontalBox();box3.add(label3);box3.add(Box.createHorizontalStrut(5)); box3.add(choice);box3.add(Box.createHorizontalStrut(5)); box3.add(label5);box3.add(Box.createHorizontalStrut(5)); box3.add(choice2);box3.add(Box.createHorizontalStrut(5)); box3.add(label6);box3.add(Box.createHorizontalStrut(5)); box3.add(choice3);baseBox = Box.createVerticalBox(); baseBox.add(box1);baseBox.add(Box.createVerticalStrut(5)); baseBox.add(box2);baseBox.add(Box.createVerticalStrut(5)); baseBox.add(box3);panel1.add(baseBox);panel1.setBackground(Color.gray);panel3.add(panel1, BorderLayout.WEST);panel2.add(b6);panel2.add(b7);panel2.add(b8);panel2.add(b9);panel2.setBackground(Color.gray);panel3.add(panel2, BorderLayout.EAST);add(panel3, BorderLayout.NORTH);add(canvas, BorderLayout.CENTER);canvas.addMouseListener(this);canvas.addMouseMotionListener(this);setBackground(Color.darkGray);setBounds(100, 100, 200, 200);setVisible(true);validate();}public void actionPerformed(ActionEvent e) { int a,b,c;g = canvas.getGraphics();if (e.getSource() == b7) {System.exit(0);}else if (e.getSource() == b6) {canvas.update(g);}else if(e.getSource()==b8){flag=1;}else if(e.getSource()==b9){flag=0;}x = Integer.parseInt(t1.getText());y = Integer.parseInt(t2.getText());z = Integer.parseInt(t3.getText());r = Integer.parseInt(t4.getText());canvas.setx1(x);canvas.sety1(y);canvas.setx2(z);canvas.sety2(r);if (e.getSource() == b1 || e.getSource() == b2) { canvas.paint(g, 1);} else if (e.getSource() == b3) {canvas.paint(g, 2);} else if (e.getSource() == b4) {canvas.paint(g, 3);}}public void itemStateChanged(ItemEvent e) { if(e.getSource()==choice){if (choice.getSelectedIndex() == 0)canvas.setcolor(Color.red);if (choice.getSelectedIndex() == 1)canvas.setcolor(Color.green);if (choice.getSelectedIndex() == 2)canvas.setcolor(Color.blue);if (choice.getSelectedIndex() == 3)canvas.setcolor(Color.yellow);if (choice.getSelectedIndex() == 4)canvas.setcolor(Color.cyan);if (choice.getSelectedIndex() == 5)canvas.setcolor(Color.orange);if (choice.getSelectedIndex() == 6)canvas.setcolor(Color.black);}else if(e.getSource()==choice2){if(choice2.getSelectedIndex() == 0){ xiangpi=4;}if(choice2.getSelectedIndex() == 1){ xiangpi=10;}if(choice2.getSelectedIndex() == 2){ xiangpi=20;}if(choice2.getSelectedIndex() == 3){ xiangpi=50;}if(choice2.getSelectedIndex() == 4){ xiangpi=100;}if(choice2.getSelectedIndex() == 5){ xiangpi=200;}}else if(e.getSource()==choice3){if(choice3.getSelectedIndex() == 0){ huabi=1;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 1){ huabi=3;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 2){ huabi=8;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 3){ huabi=10;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 4){ huabi=13;canvas.sethuabi(huabi);}if(choice3.getSelectedIndex() == 5){ huabi=16;canvas.sethuabi(huabi);}}}public void mousePressed(MouseEvent e) {p = e.getX();q = e.getY();}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}public void mouseDragged(MouseEvent e) {g = canvas.getGraphics();Graphics2D g_2d=(Graphics2D)g;BasicStroke bs=newBasicStroke(huabi,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER);g_2d.setStroke(bs);z = e.getX();r = e.getY();canvas.setx1(p);canvas.sety1(q);canvas.setx2(z);canvas.sety2(r);if(flag==0)canvas.paint(g, 2);else if(flag==1){g.setColor(Color.white);g.fillOval(p-xiangpi/2, q-xiangpi/2, xiangpi, xiangpi);}p = z;q = r;}public void mouseMoved(MouseEvent e) {}}public class Text {public static void main(String[] args) {Myframe a=new Myframe();a.addWindowListener(new java.awt.event.WindowAdapter(){ public void windowClosing(java.awt.event.WindowEvent e){ System.exit(0);}});}}。