《计算机图形学》实验7实验报告实验题目:复杂Java绘图板程序实验内容:1阅读理解本试验提供的参考资料。2编写并调通一个复杂绘图板的java程序。参考资料:1MiniDrawPad.java2Java图形处理介绍.doc基本概念:直接颜色模型(DirectColorModel):直接颜色模型在程序中指定整型数中的多少位和哪些位分别用于表示alpaha、红、绿、蓝四个属性。索引颜色模型:索引颜色模型把颜色值看成红、绿、蓝数值查找表中的索引,在Java中索引是个字节。实际要查找3个表,各对应一个主颜色(另外,你还可以用第4个表查找ALPHA)。每个表项包含8位,用于指定颜色强度。图形观察者(ImageObserver):图形观察者机制是Observer设计模式的一个例子。其思路是让任意个其它对象“观察”一个对象。被观察对象产生观察者要知道的改变时,被观察对象调用所有观察者。被观察对象可以决定何时通知观察者。媒介跟踪器(MediaTracker):媒介跟踪器MediaTracker在处理动画播放程序或多幅图象时有广泛的应用。为达到图象平滑的效果,通常小程序和应用程序要在某个图形完全装入后才能工作。内存图形源(MemoryImageSource):在Java中另一种图形源是内存:可以在程序中建立整形或字节数组来表示图素值,并利用Java的MemoryImageSource类构造Image的实例。过滤器(ImageFilter):AWT通过允许你在图象生成者和图象使用者之间插入图象过滤器的方式支持对图象的操作。一个图象过滤器实际上就是一个ImageFilter类,它放置在一个生产者和一个使用者之间,在使用者得到图象之前改变图象的数据。客户程序:客户程序由三个类组成:client类,network类和writer类。Client类是其主体部分,此类由Frame类扩展而来,Writer类是在network类中启动的线程。算法设计:1.主窗体的设计。主类(MiniDrawPad)用来生成主界面,完成画图板的主要框架。主类由JFrame派生出来。主界面由菜单栏、工具栏和画图区域三部分组成,布局格式采用BorderLayout布局形式。2.单栏和工具栏的设计。菜单栏包括文件菜单栏、颜色菜单栏、线条粗细菜单栏和提示菜单栏。其中①文件菜单栏包括文件的新建、打开、保存等选项;②颜色菜单栏可以进行颜色选择;③线条粗细菜单栏设置线条的粗细;④帮助菜单栏给出提示信息。工具栏由新建、打开和保存文件按钮、基本图形的按钮、选择字体风格复选框和字体下拉列表框组成。在主类中添加并对菜单栏和工具栏添加事件监听。3.事件响应的处理。对菜单栏、工具栏和用鼠标画图的事件响应进行处理。①菜单栏中文件的新建、打开和保存菜单事件的处理:Java把每个文件都视作顺序字节流。如果要在Java中进行文件处理,则必须用到Java.io包。这个包定义了一些流类,选用FileInputStream(从文件中读入数据)和FIleOutputStream(向文件输出数据),通过建立这些文件的对象便可以打开文件。这些流相应地从InputStream和OutputStream派生,这些文件均使用文件流,所以必须将文件结构化以适应程序的要求。我们需要对保存的对象序列化,然后以输出流的方式保存。在程序中用newFile()、loadFile()和saveFile()三个函数分别实现文件的新建、打开和保存。②工具栏事件的处理:主要有一些Button组成。我们用ButtonHandler内部类处理基本单元事件,ButtonHandler1内部类处理新建、打开和保存文件按钮,在画图类DrawPanel中定义CreateNewItem()函数处理工具栏中的画图事件。③鼠标画图:由于画图板主要是用来画图,所以需要在程序中添加对鼠标按下、拖动、进入、退出、移动和单机事件进行监听并进行处理。内部类mouseA定义了完成鼠标按下、松开、进入、退出事件响应。内部类mouseB完成鼠标拖动和移动事件响应。4.画图的基本功能。在程序设计中用到了动态绑定,我们可以提取他们的公共属性,先建立一个父类,然后建立各个子类,继承父类中的方法并将父类中的draw函数重写。一些关于图形形状的类,最主要是用于画图、字体和橡皮擦等基本类型。//主函数段publicstaticvoidmain(Stringargs[]){try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptione){}//将界面设置为当前windows风格MiniDrawPadnewPad=newMiniDrawPad();newPad.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}//创建各种基本图形的按钮drawingArea=newDrawPanel();choices=newJButton[names.length];buttonPanel=newJToolBar(JToolBar.VERTICAL);buttonPanel=newJToolBar(JToolBar.HORIZONTAL);ButtonHandlerhandler=newButtonHandler();ButtonHandler1handler1=newButtonHandler1();buttonPanel.setBackground(newColor(0,255,0));//导入图形图标,图标存放在项目文件夹下的Icons目录内for(inti=0;ichoices.length;i++){items[i]=newImageIcon(Icons/+names[i]+.gif);choices[i]=newJButton(items[i]);choices[i].setToolTipText(tipText[i]);choices[i].setPreferredSize(newDimension(33,33));choices[i].setBackground(newColor(0,255,0));buttonPanel.add(choices[i]);}//画图面板类,用来画图classDrawPanelextendsJPanel{publicDrawPanel(){setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));setBackground(Color.white);addMouseListener(newmouseA());addMouseMotionListener(newmouseB());}@OverridepublicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2d=(Graphics2D)g;//定义画笔intj=0;while(j=index){draw(g2d,itemList[j]);j++;}}voiddraw(Graphics2Dg2d,drawingsi){i.draw(g2d);//将画笔传入到各个子类中,用来完成各自的绘图}}代码:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;Importjava.io.*publicclassMiniDrawPadextendsJFrame//主类,扩展了JFrame类,用来生成主界面{privateObjectInputStreaminput;privateObjectOutputStreamoutput;//定义输入输出流,用来调用和保存图像文件privateJLabelstatusBar;//显示鼠标状态的提示条privateDrawPaneldrawingArea;//画图区域privateintwidth=850,height=600;//定义画图区域初始大小drawings[]itemList=newdrawings[5000];//用来存放基本图形的数组privateJButtonchoices[];//按钮数组,存放以下名称的功能按钮JToolBarbuttonPanel;//定义按钮面板privateintcurrentChoice=3;//设置默认画图状态为随笔画intindex=0;//当前已经绘制的图形数目privateColorcolor=Color.black;//当前画笔颜色intR,G,B;//用来存放当前色彩值intf1,f2;//用来存放当前字体风格Stringstyle1;//用来存放当前字体privatefloatstroke=1.0f;//设置画笔粗细,默认值为1.0fJCheckBoxbold,italic;//定义字体风格选择框JComboBoxstyles;privateStringnames[]={New,Open,Save,Pencil,Line,Rect,fRect,Oval,fOval,Circle,fCircle,RoundRect,frRect,Rubber,Color,Stroke,Word};privateStringstyleNames[]={宋体,隶书,华文彩云,仿宋_GB2312,华文行楷,方正舒体,TimesNewRoman,Serif,Monospaced,SonsSerif,Garamond};privateIconitems[];privateStringtipText[]={新建,打开,保存,铅笔画,直线,空心矩形,填充矩形,空心椭圆,填充椭圆,空心圆形,填充圆形,空心圆角矩形,填充圆角矩形,橡皮擦,颜色,线条,输入文本};publicMiniDrawPad()//构造函数{super(绘图板姓名:郄利飞学号:201101010303);JMenuBarbar=newJMenuBar();JMenufileMenu=newJMenu(文件(F));fileMenu.setMnemonic('F');//新建文件菜单项JMenuItemnewItem=newJMenuItem(新建-N);newItem.setMnemonic('N');newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));newItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){newFile();//如果被触发,则调用新建文件函数段}});fileMenu.add(newItem);//保存文件菜单项JMenuItemsaveItem=newJMenuItem(保存-S);saveItem.setMnemonic('S');saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));saveItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){saveFile();//如果被触发,则调用保存文件函数段}});fileMenu.add(saveItem);//打开文件菜单项JMenuItemopenItem=newJMenuItem(打开-L);openItem.setMnemonic('L');openItem.setAccelerato