图形编程第八章2回顾•Java最新的事件处理方法是基于授权事件模型。•事件是描述事件源状态变化的对象。用户与GUI组件交互就会生成事件。•事件源是一个生成事件的对象。当这个对象的内部状态改变时,事件就会发生。•在发生事件时,事件源将调用监听器定义的相应方法。3目标•解释图形的绘制•描述Graphics对象•了解Font类•了解FontMetrics类•了解Color类•掌握绘制各种图形的方法4•所有的图形被画到相关联的窗口中。•完全可以直接在框架(Frame)中绘入文本信息,甚至可以直接在框架中绘图。•框架经常被设计为一个组件容器。一般首先在一个面板中进行绘制,然后再将这个面板添加到框架。在框架中显示信息5paintComponent方法•JPanel非常适合于绘制自定义图形•其图形对象是作为paintComponent()方法的参数获得的。•要创建自定义图形,需要编写扩展JPanel类的新类。并覆盖父类的paintComponent()方法:publicvoidpaintComponent(Graphicsg){...//将在这里通过参数g完成绘制代码}6Graphics对象•paintComponent方法包含一个Graphics类型的参数。•Graphics对象记录针对绘制图形和文本的一系列设置,比如设置的图标或当前颜色、字体等。•Java中,所有绘制都必须通过一个图形对象。7Graphics对象的局限性•可以用Graphics对象绘制的图形是原始图形。•对于这些图形,不能使用实数坐标•不能绘制虚线或宽度不定的线条•不能使用纹理或渐变颜色填充形体8Graphics2D对象•Java2D包括一个Graphics2D类,此类扩展了Graphics类,所有图形方法都可以配合Graphics2D对象使用•Java2D图形的重要功能:颜色和图案:图形可以用渐变颜色和填充图案着色。透明绘制:图形的不透明度通过α透明值控制。本地字体:平台上的所有本地字体都可用于绘制文本。画笔的显式控制:可以使用线条的粗细、虚线图案以及段连接样式。坐标系的转换:可以使用平移、缩放、旋转和剪切为了解决图形对象的局限性,在Java1.1以后的版本中引入了Java2D。9基本的绘图方法publicvoidpaint(Graphicsg){g.setColor(someColor);//设置颜色g.setFont(someLimitedFont);//设置字体g.drawString(...);//绘制字符串g.drawLine(...);//画线g.drawRect(...);//绘制图形轮廓g.fillRect(...);//绘制填充图形g.drawPolygon(...);//绘制图形轮廓g.fillPolygon(...);//绘制图形轮廓...}每个AWT组件定义一种传递Graphics对象的paint方法,绘制便是在该对象上执行。设置画笔参数10Java2D中的基本绘图方法publicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2d=(Graphics2D)g;//强制转换为Graphics2Dg2d.setPaint(fillColorOrPattern);g2d.setStroke(penThicknessOrPattern);g2d.setComposite(someAlphaComposite);g2d.setFont(anyFont);g2d.setColor(anyColor);g2d.translate(...);g2d.rotate(...);g2d.scale(...);g2d.shear(...);g2d.setTransform(someAffineTransform);SomeShapes=newSomeShape(...);g2d.draw(s);//绘制图形轮廓g2d.fill(s);//绘制填充图形}设置画笔参数11Font类Font类只有一个构造函数:publicFont(Stringname,intstyle,intpointsize)参数name表示字体的名称。参数style表示样式可以是Font.PLAIN、Font.BOLD或Font.ITALIC参数pointsize表示字体的点数,即以磅为单位的字体大小,可以是11、12、14、16等。publicvoidpaint(Graphicsg){...g.setFont(newFont(Helvetica,Font.ITALIC,18));g.drawString(Drawwhereeveryouwant,100,10);...}12•通过使用getFontMetrics()方法,而不是new运算符(因为它是一个抽象类),可以创建该类的对象。•这个对象包含与字体相关的大量信息,包括字符的高度、按像素数计算的字符串宽度等。•常用方法如下:intstringWidth(Strings):返回字符串宽度intcharWidth(charc):返回字符c的宽度intgetHeight():返回字体的高度FontMetrics类有时,需要测量用特殊字体显示的一个字符串,可以使用FontMetrics类13使用字体示例1importjava.awt.*;importjavax.swing.*;classFontsPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){Stringquote=Happinessisanattitude.;Fontf=newFont(Georgia,Font.ITALIC,16);g.setFont(f);g.drawString(quote,20,20);}}该包中包含JPanel和JFrame组件创建一种新字体,并将该字体设置为当前字体publicclassFontsDemoextendsJFrame{publicFontsDemo(){setTitle(test);setSize(300,200);ContainercontentPane=getContentPane();contentPane.add(newFontsPanel());}publicstaticvoidmain(Stringargs[]){FontsDemoframe=newFontsDemo();frame.show();}}14使用字体示例2importjava.awt.*;importjavax.swing.*;classFonts2PanelextendsJPanel{publicvoidpaintComponent(Graphicsg){Stringmyquote=Happinessisanattitude.;Fontf=newFont(TimesNewRoman,Font.BOLD+Font.ITALIC,24);g.setFont(f);FontMetricsfm=getFontMetrics(f);intx=(getSize().width-fm.stringWidth(myquote))/2;inty=getSize().height/2;g.drawString(myquote,x,y);}}创建一种新字体,并设为当前字体求字符串宽度15列出当前平台上所有可用字体importjava.awt.*;publicclassListFonts{publicstaticvoidmain(String[]args){GraphicsEnvironmentenv=GraphicsEnvironment.getLocalGraphicsEnvironment();String[]fontNames=env.getAvailableFontFamilyNames();System.out.println(可用字体:);for(inti=0;ifontNames.length;i++)System.out.println(+fontNames[i]);}}16颜色java.awt.Color类提供了13个可用作标准颜色的常量:black(黑色)green(绿色)red(红色)blue(蓝色)lightGray(浅灰色)white(白色)cyan(蓝绿色)magenta(洋红色)yellow(黄色)darkGray(深灰色)orange(橙色)gray(灰色)pink(粉红色)17Color类的构造函数Color类的构造函数如下:-Color(intred,intgreen,intblue):使用三个分别代表红、绿、蓝的整数来表示它们混合的颜色。这些值必须在0到255之间。-Color(floatred,floatgreen,floatblue):用三个浮点数指定红、绿、蓝的相对混合。Colora=newColor(0.907F,2F,0F);Colorb=newColor(255,255,0);18如果要修改或设置组件的颜色,可以使用下列几种方法:voidsetColor(ColornewColor):设置当前绘制的颜色voidsetForeground(Color):设置前景色voidsetBackground(Color):设置背景色设置颜色方法19使用颜色示例importjava.awt.*;importjavax.swing.*;classColorsPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){Fontf=newFont(Georgia,Font.ITALIC,16);g.setFont(f);g.setColor(Color.red);g.drawString(Hello,75,100);g.setColor(newColor(0,128,128));g.drawString(World,75,125);}}20绘制图形2-1使用AWT时,通常通过调用Graphics对象的drawXxx或fillXxx方法来绘制图形。通过drawXxx方法绘制图形边框,通过fillXxx方法绘制填充图形。这些对象用当前选择的颜色来绘制和填充,黑色是默认的颜色。21绘制图形2-2在Java2D中,通常先创建Shape对象,然后调用Graphics2D对象的draw或fill方法。Java2D库以面向对象的方式组合几何形体。java.awt.geom包中囊括了一些有用的Shape实现。如:Line2DRectangle2DEllipse2D22使用线条绘制图形java.awt.Graphics中提供了一些方法用来绘制图形对象中的直线和多边形。方法如下:voiddrawLine(intstartX,intstartY,intentX,intendY):绘制一条直线voiddrawPolygon(intx[],inty[],intnumpoints):绘制多边形轮廓voidfillPolygon(intx[],inty[],intnumpoints):绘制填充多边形voiddrawPolyline(intx[],inty[],intnumpoints):绘制顺序连线,如果第一个点和最后一个点不同,该图形不封闭23绘制矩形和椭圆voiddrawRect(inttop,intleft,intwidth,intheight):绘制矩形边框voidfillRect(inttop,intleft,intwidth,intheight):绘制填充矩形voiddrawOval(inttop,intleft,intwidth,intheight):绘制椭圆边框voidfillOval(inttop,intleft,intwidth,intheight):绘制填充椭圆24绘图示例classShapesPanelextendsJPanel