Java绘图5.1Java图形5.2Paint方法、Update方法和Repaint方法5.3Graphics类5.4Color类5.5Graphics2D类习题
5.1Java图形抽象窗口化工具(AWT)为图形用户界面编程提供API编程接口,使得Java可以提供较好的图形用户界面。AWT把图形处理分为两个层次:一是处理原始图形,这一层较原始,图形直接以点、线和面的形式画到界面上;二是提供大量组件,实现可定制的图形用户界面。本章主要讨论如何在界面上画图形及所画图形的特征。Java编程语言中的图形坐标系统不同于数学中的坐标系,屏幕左上角为(0,0),右下角为屏幕水平向右和垂直向下增长的像素数。5.2Paint方法、Update方法和Repaint方法
1.Paint方法publicvoidpaint(Graphicsg)以画布为参数,在画布上执行画图方法。在Applet中,不显式地调用paint方法。
2.Repaint方法Applet重画时系统自动调用paint方法。
3.Update方法publicvoidupdate(Graphicsg)更新容器,向Repaint发出刷新小应用程序的信号,缺省的Update方法清除Applet画图区并调用Paint方法。5.3Graphics类Graphics类是所有图形上下文的抽象基类,允许应用程序在各种设备上实现组件的画图。图形对象封装了Java支持的基本渲染操作的状态信息,包括画图的组件对象、渲染区域的坐标(coordinates)、区域(clip)、颜色(color)、字体(font)、画图模式等。Graphics类提供画各种图形的方法,其中包括线、圆和椭圆、矩形和多边形、图像以及各种字体的文本等。这些方法具体如下:publicabstractvoidclipRect(intx,inty,intwidth,intheight)指定的区域切分。publicabstractvoiddrawLine(intx1,inty1,intx2,inty2)使用当前颜色,在点(x1,y1)和(x2,y2)之间画线。publicabstractvoiddrawOval(intx,inty,intwidth,intheight)画椭圆。publicabstractvoidfillOval(intx,inty,intwidth,intheight)画实心椭圆。publicabstractvoiddrawPolygon(int[]xPoints,int[]yPoints,intnPoints)画x和y坐标定义的多边形。publicvoiddrawRect(intx,inty,intwidth,intheight)画矩形。publicvoiddrawRect(intx,inty,intwidth,intheight)画实心矩形。publicabstractvoiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)使用当前颜色画圆角矩形。publicabstractvoiddrawString(Stringstr,intx,inty)使用当前字体和颜色画字符串str。publicabstractvoidsetColor(Colorc)设置图形上下文的当前颜色。publicabstractvoidsetPaintMode()设置画模式。publicabstractbooleandrawImage(Imageimg,intx,inty,ImageObserverobserver)画特定图。publicabstractvoidsetFont(Fontfont)设置特定的font字体。使用时首先得到font对象的一个实例,Font类常用构造函数为:publicFont(Stringname,intstyle,intsize)通过指定的name、style和size创建字体实例。name指字体名,像“隶书”、“TimesRoman”等,字体风格为粗体、斜体,size指字号大小。例如:Fontf=newFont("TimesRoman",Font.BOLD+Font.ITALIC,12);创建了具有粗斜体风格的12磅的TimesRoman字体。【例5java绘图基础教程.1】设置Graphics对象画图,显示结果如图5.1所示。源程序代码如下://程序文件名SimpleGUI.javaimportjava.awt.*;importjava.applet.*;publicclassSimpleGUIextendsApplet{ ImagesamImage; publicvoidinit() { samImage=getImage(getDocumentBase(),"sample.gif");} publicvoidpaint(Graphicsg){ //g.clipRect(50,50,180,180); //画线 g.drawLine(0,0,20,30); //输出字符串 g.drawString("图形显示",100,30); //设置颜色 Colorc=newColor(255,200,0); g.setColor(c); //设置字体Fontf=newFont("TimesRoman",Font.BOLD+Font.ITALIC,24);g.setFont(f);g.drawString("图形显示",180,30);g.drawLine(20,20,100,50);g.drawLine(20,20,50,100);//矩形g.drawRect(40,40,40,40);g.fillRect(60,60,40,40);g.setColor(Color.red);//3D矩形g.draw3DRect(80,80,40,40,true);g.draw3DRect(100,100,40,40,false);g.fill3DRect(120,120,40,40,true);//椭圆g.drawOval(150,150,30,40);g.fillOval(170,170,20,20);g.setColor(Color.blue);//圆角矩形g.drawRoundRect(180,180,40,40,20,20);g.fillRoundRect(200,200,40,40,20,20);//多边形intxC[]={242,260,254,297,242};intyC[]={240,243,290,300,270};g.drawPolygon(xC,yC,5);//图片g.drawImage(samImage,250,50,this); }}图5.1简单的图形界面将例5.1注释的程序语句//g.clipRect(50,50,180,180);的注释符号去掉,重新编译执行,可以看见如图5.2所示的结果。图5.2裁剪后的图形界面5.4Color类Color类是用来封装颜色的,在上面的例子中多次用到。使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色,像红色Color.red、橙色Color.orange等;也可以使用RGB颜色模式进行定义。所谓RGB颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255。例如Colorc=newColor(255,200,0);定义橙色。表5.1给出常用颜色的RGB值以及对应的类预定义参数。表5.1常用颜色的RGB值以及对应的类预定义参数Color还有一个构造函数,它构造的Color对象用于是否透明显示颜色。publicColor(intred,intgreen,intblue,intalpha)其中:前三个分量即RGB颜色模式中的参数,第四个alpha分量指透明的程度。当alpha分量为255时,表示完全不透明,正常显示;当alpha分量为0时,表示完全透明,前三个分量不起作用,而介于0~255之间的值可以制造出颜色不同的层次效果。【例5.2】测试Color对象,界面如图5.3所示。源程序代码如下://程序文件名UseColor.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;publicclassUseColorextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; g.setColor(Color.blue); g.fill(newEllipse2D.Float(50,50,150,150)); g.setColor(newColor(255,0,0,0)); g.fill(newEllipse2D.Float(50,50,140,140)); g.setColor(newColor(255,0,0,64)); g.fill(newEllipse2D.Float(50,50,130,130)); g.setColor(newColor(255,0,0,128)); g.fill(newEllipse2D.Float(50,50,110,110)); g.setColor(newColor(255,0,0,255)); g.fill(newEllipse2D.Float(50,50,90,90)); g.setColor(newColor(255,200,0)); g.fill(newEllipse2D.Float(50,50,70,70)); }}图5.3颜色测试界面5.5Graphics2D类Graphics2D类继承于Graphics类,提供几何学、坐标变换、颜色管理以及文本排列等的更高级控制。Graphics2D类是Java平台上渲染二维图形、文字、以及图片的基础类,提供较好的对绘制形状、填充形状、旋转形状、绘制文本、绘制图像以及定义颜色的支持。在AWT编程接口中,用户通过Paint方法接收Graphics对象作为参数,若是使用Graphics2D类,就需要在Paint方法中进行强制转换。Publicvoidpaint(Graphicsold){ Graphics2Dnew=(Graphics2D)old;}5.5.1绘制形状Graphics2D提供以下两个方法进行形状的绘制:publicabstractvoiddraw(Shapes)根据Graphics2D的环境设置画出形状s,其中Shape接口包含的类如表5.2所示。publicabstractvoidfill(Shapes)画实心形状s。表5.2Graphics2D绘制的图形类其中GeneralPath是一般的几何路径,它的构造函数为:publicGeneralPath()构造一个空的对象。常用的方法有四个,分别如下:publicvoidlineTo(floatx,floaty)从当前坐标点到(x,y)坐标点画一条直线,将此点添加到路径上。publicvoidmoveTo(floatx,floaty)移动到坐标点(x,y),在路径上添加此点。publicvoidquadTo(floatx1,floaty1,floatx2,floaty2)以坐标点(x1,y1)为控制点,在当前坐标点和坐标点(x2,y2)之间插入二次曲线片断。publicvoidcurveTo(floatx1,floaty1,floatx2,floaty2,floatx3,floaty3)以(x1,y1)和(x2,y2)为控制点,在当前坐标点和(x3,y3)之间插入曲线片断。在Draw方法中提到Graphics2D的环境设置。所谓的环境设置是指设置画图的笔画和填充属性等,设置方法分别如下:publicabstractvoidsetStroke(Strokes)设置笔画的粗细。其中Stroke接口中常用BasicStroke类来实现,一个较简单的构造函数为publicBasicStroke(floatwidth)创建实线笔画宽度为width。publicabstractvoidsetPaint(Paintpaint)设置Graphics2D环境的填充属性。其中,paint的值可以为渐变填充类java.awt.GradientPaint,也可以为图形填充类java.awt.TexturePaint,后者将在5.5.3节绘制图像中讲到。渐变填充类常用构造函数为publicGradientPaint(floatx1,floaty1,Colorcolor1,floatx2,floaty2,Colorcolor2,booleancyclic)构建一个渐变GradientPaint对象,在起始坐标点到目标坐标点之间从颜色color1到color2渐变,cyclic为真,循环渐变。【例5.3】演示了几何形状、笔画变换以及颜色渐变显示。其中直线的笔画宽度为10,其它笔画宽度为5,中间三个图形实现绿色到蓝色的循环渐变,后三个图形实现红色到黄色的循环渐变,如图5.4所示。//程序文件名GUI2D.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;publicclassGUI2DextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; //设置笔画宽度 BasicStrokestroke=newBasicStroke(10); g.setStroke(stroke); //画线 Line2Dline=newLine2D.Float(0,0,20,30); g.draw(line); line=newLine2D.Float(50,50,100,50); g.draw(line); line=newLine2D.Float(50,50,50,100); g.draw(line); stroke=newBasicStroke(5); g.setStroke(stroke); //设置渐变填充 GradientPaintgt=newGradientPaint(0,0,Color.green,50,30,Color.blue,true); g.setPaint((Paint)gt); //画矩形 Rectangle2Drect=newRectangle2D.Float(80,80,40,40); g.draw(rect); rect=newRectangle2D.Float(100,100,40,40); g.fill(rect); //画椭圆 Ellipse2Dellipse=newEllipse2D.Float(120,120,30,40); g.draw(ellipse); gt=newGradientPaint(0,0,Color.red,30,30,Color.yellow,true); g.setPaint((Paint)gt); ellipse=newEllipse2D.Float(140,140,20,20); g.fill(ellipse); //画圆角矩形 RoundRectangle2DroundRect=newRoundRectangle2D.Float(160,160,40,40,20,20); g.draw(roundRect); roundRect=newRoundRectangle2D.Float(180,180,40,40,20,20); g.fill(roundRect); //画几何图形 GeneralPathpath=newGeneralPath(); path.moveTo(150,0); path.lineTo(160,50); path.curveTo(190,200,240,140,200,100); g.fill(path);}}图5.4通过Graphics2D对象绘制形状5.5.2绘制文本Graphics2D类提供一个文本布局(TextLayout)对象,用于实现各种字体或段落文本的绘制。其构造函数为:publicTextLayout(Stringstring,Fontfont,FontRenderContextfrc)通过字符串string和字体font构造布局。publicvoiddraw(Graphics2Dg2,floatx,floaty)将这个TextLayout对象画到Graphics2D对象g2上的x,y坐标处。publicRectangle2DgetBounds()返回TextLayout对象的区域。【例5.4】测试绘制文本功能,如图5.5所示。源程序代码如下://程序文件GUIText.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;importjava.awt.font.*;publicclassGUITextextendsApplet{ publicvoidpaint(Graphicsoldg) { Graphics2Dg=(Graphics2D)oldg; //设置字体 Fontf1=newFont("Courier",Font.PLAIN,24); Fontf2=newFont("helvetica",Font.BOLD,24); FontRenderContextfrc=g.getFontRenderContext(); Stringstr=newString("这是一个文本布局类的实现"); Stringstr2=newString("扩充绘制文本的功能"); //构造文本布局对象 TextLayoutlayout=newTextLayout(str,f1,frc); Point2Dloc=newPoint2D.Float(20,50); //绘制文本 layout.draw(g,(float)loc.getX(),(float)loc.getY()); //设置边框 Rectangle2Dbounds=layout.getBounds(); bounds.setRect(bounds.getX()+loc.getX(), bounds.getY()+loc.getY(), bounds.getWidth(), bounds.getHeight()); g.draw(bounds); layout=newTextLayout(str2,f2,frc); g.setColor(Color.red); layout.draw(g,20,80);}}图5.5Graphics2D对象绘制文本5.5.3绘制图像绘制图像用到BufferedImage类,BufferedImage类是指存放图像数据的可访问的缓冲。其构造函数为:publicBufferedImage(intwidth,intheight,intimageType)使用宽度(width)、高度(height)和imageType类型构造BufferedImage对象。publicGraphics2DcreateGraphics()用图片填充椭圆的具体过程如下:(1)创建一个Graphics2D,可以画到BufferedImage中。例如构建一个BufferedImage对象buf。BufferedImagebuf=newBufferedImage(img.getWidth(this),img.getHeight(this),BufferedImage.TYPE_INT_ARGB);创建一个临时Graphics2D对象:GraphicstmpG=buf.createGraphics();将图像画入临时缓冲:tmpG.drawImage(img,10,10,this);(2)用TexturePaint类进行填充:publicTexturePaint(BufferedImagetxtr,Rectangle2Danchor)构造TexturePaint对象,需要一个Rectangle2D对象来存放该对象:Rectangle2Drect=newRectangle2D.Float(0,0,h,w);TexturePaintt=newTexturePaint(buf,rect);(3)然后设置填充模式,并进行填充:g.setPaint(t);g.fill(newEllipse2D.Float(100,50,60,60));【例5.5】完成图像显示,并将区域蓝色透明显示,然后进行图片填充,如图5.6所示。源程序代码如下://程序文件名GUIImage.javaimportjava.awt.*;importjava.applet.*;importjava.awt.geom.*;importjava.awt.font.*;importjava.awt.image.*;.*;publicclassGUIImageextendsApplet{publicvoidpaint(Graphicsoldg){ Graphics2Dg=(Graphics2D)oldg; try {
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/18229.html