南京工程学院实验报告课程名称JAVA基础实验项目名称图形用户界面设计实验题目阿基米德螺线图形设计实验学生班级网络132实验学生姓名薛康威学号202130834实验时间2015.5.25实验地点信息楼实验成绩评定指导教师签字年月日一、实验目的和要求掌握JavaSwing组件的使用方法,理解委托事件处理模型,掌握多种布局方式,掌握窗口菜单和快捷菜单设计方式,熟悉在组件上绘图的方法,设计出具有图形用户界面的、能够响应用户界面的、能够响应事件并处理异常的Java应用程序。要求如下:(1)采用Swing组件设计图形用户界面,使用3个以上相同组件要声明组件数组。(2)响应事件。(3)异常处理,当输入数据错误时,弹出对话框,提示重新输入信息。二、实验题目阿基米德螺线图形设计,指定图形大小、位置和颜色。三、实验方法与步骤(需求分析、算法设计思路、流程图等)(1)需求分析这个程序主要由两大块组成,自定义图形用户界面和阿基米德螺线图形算法。(2)算法设计思路首先是界面设计。内容窗格采用边布局,North处添加设置面板,Center处添加画布。其中设置面板采用流布局,添加设置圈数的文本框、选择颜色的单选按钮和最终“确定”的按钮。其次是阿基米德螺线图形算法。根据数学公式r=aθ,转换成直角坐标方程组后,在图形类Graphics中标点填充即可。最后便是事件处理。在按钮“确定”上注册事件监听,在响应方法里获得圈数(需要做异常处理)、颜色的参数,并调用画布类,将阿基米德螺线画出。四、实验原始纪录(源程序、数据结构等)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassArchimedesJFrameextendsJFrameimplementsActionListener{privateArchimedesCanvasarchimedes;//画布类声明privateJButtonjb3;privateJPaneljp1;privateJTextFieldtext_q;privateJRadioButtonbcolor[];privatedoublen;publicArchimedesJFrame(){super(阿基米德螺线);Dimensiondim=getToolkit().getScreenSize();this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2);this.setDefaultCloseOperation(EXIT_ON_CLOSE);text_q=newJTextField(10);jp1=newJPanel();jp1.add(newJLabel(圈数:));jp1.add(text_q);jb3=newJButton(确定);jp1.add(jb3);jb3.addActionListener(this);Stringlk[]={,};for(inti=0;ilk.length;i++){jp1.add(newJLabel(lk[i]));}jp1.add(newJLabel(颜色:));Stringcolorstr[]={红,绿,蓝};ButtonGroupcolorgroup=newButtonGroup();bcolor=newJRadioButton[colorstr.length];for(inti=0;ibcolor.length;i++){bcolor[i]=newJRadioButton(colorstr[i]);colorgroup.add(bcolor[i]);jp1.add(bcolor[i]);bcolor[i].addActionListener(this);}this.getContentPane().add(jp1,North);archimedes=newArchimedesCanvas(Color.black,this.n);this.getContentPane().add(newJScrollPane(archimedes),Center);this.setVisible(true);}//响应方法publicvoidactionPerformed(ActionEvente){Colorc=null;if(e.getSource()==bcolor[0])//获得颜色c=newColor(255,0,0);if(e.getSource()==bcolor[1])//获得颜色c=newColor(0,255,0);if(e.getSource()==bcolor[2])//获得颜色c=newColor(0,0,255);if(e.getSource()==jb3){try{this.n=Double.parseDouble(text_q.getText());//获得圈数}catch(NumberFormatExceptionnfex){JOptionPane.showMessageDialog(this,无法转换成浮点数,提醒,JOptionPane.WARNING_MESSAGE);//异常处理}}try{if(n0||n20)thrownewException();archimedes.setn(n);//设置所画圈数archimedes.setColor(c);//设置所画颜色archimedes.repaint();}catch(Exceptionqwe){JOptionPane.showMessageDialog(this,圈数必须在0~20之间,提醒,JOptionPane.WARNING_MESSAGE);//异常处理}}publicstaticvoidmain(String[]args){newArchimedesJFrame();}}//画布类方法实现classArchimedesCanvasextendsCanvas{privateColorcolor;privatedoublex;publicArchimedesCanvas(Colorcolor,doublen){this.setBackground(Color.WHITE);this.setColor(color);this.setn(n);}publicvoidsetColor(Colorcolor){this.color=color;}publicvoidsetn(doublen){this.x=n;}publicvoidpaint(Graphicsg){intx0=this.getWidth()/2;inty0=this.getHeight()/2;g.setColor(color);g.drawLine(x0,0,x0,y0*2);//y轴g.drawLine(0,y0,x0*2,y0);//x轴for(inti=0;i2048*this.x;i++){//n圈doubleangle=i*Math.PI/1024;//角度,分成2*1024点doubleradius=0.05*angle;intx=(int)Math.round(radius*angle*Math.cos(angle));inty=(int)Math.round(radius*angle*Math.sin(angle));g.drawOval(x0+x,y0+y,1,1);//画点}}}五、实验结果及分析(计算过程与结果、数据曲线、图表等)实验结果:分析说明:阿基米德螺线的圈数设为双精度浮点型,即含半圈、1/4圈等。由于文本框为输入值,圈数的定义无法是负数或者非数字类字符,所以需要在这里添加两个异常处理,数值格式转换异常和超出规定范围异常,如上图所示。六、实验改进与思考改进:本实验是绘制阿基米德螺线,但由于计算机CPU处理速度太快,无法还原详细的绘制过程。所以根据所学知识,还可以添加线程,在画点与点之间添加睡眠时间,延缓画图过程。思考:依此模板,其实什么样的图形都可以绘制出来,只需要改动画布类的算法就可以了。