第6章图形处理6.1Java图形处理概述6.2基本图形的输出6.3设置图形的颜色6.4文字的图形化输出6.1Java图形处理概述Java系统及应用程序是如何实现图形功能的呢?首先,Java系统在AWT构件类的根类Component类中预置了一种称作Paint(Graphicsg)的方法,该方法的参数是一个图形类对象Graphicsg,通常它是由系统自动生成而不是由用户程序来实例化的,在类Graphics中系统预置了大量的用于图形处理与输出的方法,在Paint()方法的重新定义中,可以通过Graphics的对象g来调用这些方法进行图形处理与输出。特别注意的是Paint()方法的调用是由程序运行的环境而不是程序本身来完成的,每当一个AWT构件首次显示或在部分显示已被破坏而必须刷新时该方法被自动地调用。显示的破坏可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示。6.2基本图形的输出6.2.1直线的输出在Graphics类中使用drawLine*()方法画一条线段,其调用格式如下:drawLine(intx1,inty1,intx2,inty2)6.2.2矩形的输出Graphics类中提供了3种类型的矩形:普通矩形、圆角矩形和三维矩形。每一种矩形都提供两种不同风格的方法:一种是仅画出矩形的边框;另一种是不仅画出边框,并且还用相同的颜色将整个矩形区域填满。画矩形的方法如下。(1)drawRect(intx,inty,intwidth,int)画出普通矩形,参数x和y是矩形左上角顶点坐标,而参数width和height表示所画矩形的宽和高。(2)fillRect(intx,inty,intwidth,intheight)画出一个填充型风格的普通矩形。(3)drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)画出一个圆角矩形,参数中除了具有和普通矩形含义相同的前4个参数外,还增加了两个用来描述圆角性质的参数。其中arcWidth代表了圆角弧的横向直径;arcHeight代表了圆角弧的纵向直径。这两个参数的值越大,圆角越大,反之则越小。(4)fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)画填充型的圆角矩形。(5)draw3DRect(intx,inty,intwidth,intheight,booleanraised)画三维矩形,其中前4个参数意义同前,第5个参数raised定义该立体矩形是具有凸出(值为true)还是凹下(值为false)的效果。(6)fill3DRect(intx,inty,intwidth,intheight,booleanraised)画填充型三维矩形。6.2.3椭圆、圆及圆弧的输出1.画椭圆和圆在Java中绘制椭圆是以其外接矩形作为参数来实现的,其调用格式与画普通矩形的方法相似。(1)drawOval(intx,inty,intwidth,intheight)绘制一个椭圆,前两个参数为该椭圆外接矩形的左上顶点,后两个参数为其外接矩形的宽和高,当后两个参数的值相等时为圆。(2)fillOval(intx,inty,intwidth,intheight)绘制椭圆并将其内部用前景色填充。2.画弧及扇形弧是椭圆或圆的一部分,因而画弧的方法就相当于先画一个椭圆,而后取该椭圆中所需要的一部分。其调用格式如下。(1)drawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)画一段弧,其前4个参数的含义与画椭圆一样,它确定了弧所在的椭圆的大小及位置,第5个参数startAngle表示该弧开始位置的角度,第6个参数arcAngle表示该弧转过的角度。角度的参照系统规定水平向右为0°,逆时钟方向为正角度值,顺时钟方向为负角度值。如图6-5所示。图6-5(2)fillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)画一段弧并且用前景色填充该弧所包含的扇形区域,实际上这等于画了一个扇形。6.2.4多边形的输出在Java中画多边形是用其各个顶点的坐标作为参数,并依次画出连接各个顶点的线段。画一个多边形的方法依照传递参数的方式不同可分为使用数组传递参数和使用Polygon对象传递参数两类。1.使用数组传递参数(1)drawPolygon(intxPoints[],intyPoints[],intnPoints)画一个非填充型的多边形,其中xPoints参数是一个整数数组,用以存放多边形坐标点的x坐标值,yPoints参数存放相应的一组y坐标值,nPoints则表示共有几个坐标点。(2)fillPolygon(intxPoints[],intyPoints[],intnPoints)画一个填充型的多边形,其他同上。2.使用Polygon对象传递参数在上面介绍的画非填充型和填充型多边形方法中使用对象传递参数的形式为:(1)drawPolygon(Polygonp)(2)fillPolygon(Polygonp)6.3设置图形的颜色6.3.1创建Color类Java中每一种颜色都看成是由红(R)、绿(G)、蓝(B)3原色组合而成的。因此Color类的构造方法采用如下格式。(1)Color(intr,intg,intb)其中每个参数的值都在0~255之间,数值越大就表明这种颜色的成份越重。例如(0,0,0)代表黑色,(255,0,0)代表红色。当然最终在屏幕上是否能显示所定义的颜色还取决于客户端系统的调色板所支持的颜色种类的多少。若客户端系统的调色板并不支持当前所定义的颜色值,就会在调色板中挑选最接近的颜色来代替。(2)Color(intrgb)指定一个整型数表示3原色的混合值。其中rgb作为二进制数的16~23位的值代表红色,8~15位代表绿色,0~7位代表蓝色。6.3.2设置当前颜色为了能使用刚才生成好的Color对象来显示文本及绘制图形,需调用Graphics类中的setColor()方法把这个对象设置为系统当前所用的绘画颜色,其调用格式为:setColor(Colorc);例如,想要用蓝色来显示文本,最简单的办法是直接引用标准色的类变量:setColor(Color.blue);另外,Java还提供了设置构件背景和前景的方法,分别是setBackground()方法和setForeground()方法,它们都被定义在java.awt.Component类中,因此该方法能被其子类自动继承,其调用格式与setColor()方法相同:setBackground(Colorc)setForeground(Colorc)其中setForeground()方法将影响到容器构件中所有已经用其他任何颜色所绘制的图形及显示的文本,把它们一下子都变为该方法所定义的前景颜色,而不需用该颜色重新一一绘制。有“set”必有相应的“get”,Java中还提供了getColor()方法(Graphics类中)、getBackground()方法和getForeground()方法(Component类中)来分别获取当前的绘图颜色、构件背景及前景颜色的对象。6.4文字的图形化输出6.4.1Font类在Java中提供了一个font类,利用它可以定义文本的字体、风格及字号(大小),其构造方法如下:Font(Stringname,intstyle,intsize)其中第1个参数name为字体名称,如中文的“宋体”、“楷体”,或是英文的“TimesRoman”体、“Courier”体等;第3个参数size表示字体的大小;第2个参数style表示字体的风格,Font类中已定义了类变量来表示字体的style值,如Font.BOLD(表示粗体)、Font.ITALIC(表示斜体)、Font.PLAIN(表示普通体)。由于它们被定义为整数常量,因此可以进行相加运算来生成复合style,例如想让style即是粗体又是斜体,可以这样写:Fontfn=newFont(TimesRoman,Font.BOLD+Font.ITALIC,28);如果定义的字体不存在,系统就会以缺省字体来替代它。在使用字体之前,不妨先查看一下系统目前究竟支持哪些字体,这就要用到java.awt.Toolkit类中的getFontlist()方法,它返回系统目前可用的字体列表,然后就可决定到底选用哪种字体。例如:Toolkitsystk=Toolkit.getDefaultToolkit();Stringfonts=systk.getFontList();创建了Font对象以后,还要用setFont(Fontfont)方法将所创建的Font对象设为当前所用的字体。然后就可以利用Graphics类中提供的drawString()、drawChars()等方法来显示字符串与字符。6.4.2文本的显示与输出文本的图形化输出使用Graphics类中提供的drawString()、drawChars()方法,其调用格式如下。(1)drawString(Stringstr,intx,inty)其中的第一个参数str即是要显示的字符串,后面两个参数x,y指明字符串显示的起始位置坐标,具体的说,x表示第一个字符的左边界,y表示整个字符串的基线。(2)drawChars(chardata[],intoffset,intlength,intx,inty)drawChars()方法用来显示多个字符,也就是从给定的字符数组中抽取连续的一部分显示在屏幕上。其中data参数就是给定的原始字符数组,offset表示从第几个字符位置开始显示,length表示共显示几个字符,x与y参数的含义与drawString()方法一样,代表显示在屏幕上的起始位置。注意该方法与drawString()的区别是所显示内容的数据类型不同。