您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Java程序设计12图形绘制
计算机科学与技术学院赵志崑zhaozk@sdufe.edu.cn赵志崑在组件上绘制图形•图形可以绘制在任意Swing组件上,但一般绘制在面板(JPanel)上,因为面板是空白的。绘制图形需要三步:–定义一个扩展自JPanel的新类;–覆盖其paintComponent方法,将绘图的语句添加在这个方法中;–创建一个新类的对象,添加到要显示的容器中。见PanelExample.javapublicclassPanelExampleextendsJFrame{……publicPanelExample(){……contentPane.add(newMyPanel());}}classMyPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){//绘图部分代码super.paintComponent(g);g.drawRect(10,10,100,50);}}赵志崑paintComponent方法•此方法是一个回调方法,声明如下:–publicvoidpaintComponent(Graphicsg)•paintComponent方法在组件需要绘制时被自动调用:–面板首次显示时;–面板尺寸变化时;–其它窗口遮住面板时;–组件的repaint()方法被调用时。•paintComponent方法的参数:–Graphicsg:绘图对象,所有绘图动作都是对其方法的调用。g相当于一块画布,主要有以下几类方法:•绘制简单几何图形,如矩形、椭圆等;•绘制图像,如图片;•绘制文字;•设置画笔属性,如颜色、文字字体、绘图模式等。赵志崑绘制直线•voiddrawLine(intx1,inty1,intx2,inty2)–绘制一条线。见GraphicsExample.javag.drawLine(10,20,60,50);(x1,y1)(x1,y1)XY赵志崑绘制矩形•voiddrawRect(intx,inty,intwidth,intheight)–绘制一个矩形。•voidfillRect(intx,inty,intwidth,intheight)–填充一个矩形。见GraphicsExample.javag.drawRect(10,20,60,50);g.fillRect(80,20,60,50);(x,y)widthheight赵志崑绘制圆角矩形•voiddrawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)–绘制一个圆角矩形•voidfillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)–填充一个圆角矩形(x,y)widthheight见GraphicsExample.javag.drawRoundRect(10,10,100,50,20,15);g.fillRoundRect(160,10,100,50,20,15);arcHeightarcWidth赵志崑绘制椭圆•voiddrawOval(intx,inty,intwidth,intheight)–绘制一个椭圆•voidfillOval(intx,inty,intwidth,intheight)–填充一个椭圆(x,y)widthheight见GraphicsExample.javag.drawOval(10,10,100,50);g.fillOval(160,10,100,50);赵志崑绘制弧线•voiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)–绘制一条弧。•voidfillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)–填充一个扇形。见GraphicsExample.javag.drawArc(10,10,100,50,0,60);g.fillArc(160,10,100,50,0,60);(x,y)widthheightstartAnglearcAngle赵志崑绘制多边形•voiddrawPolygon(Polygonp)–绘制一个多边形•voidfillPolygon(Polygonp)–填充一个多边形见GraphicsExample.javaPolygonp=newPolygon();p.addPoint(10,10);p.addPoint(100,30);p.addPoint(50,50);p.addPoint(100,70);p.addPoint(30,100);g.drawPolygon(p);p.translate(150,0);g.fillPolygon(p);(10,10)(100,30)(50,50)(100,70)(30,100)150赵志崑设置颜色•voidsetColor(Colorc):将当前画笔颜色设置为c。•ColorgetColor():读取当前画笔颜色。•颜色的构造:–构造函数Color(intr,intg,intb):参数为红、绿、蓝的值(0-255)。–直接使用Color类中的静态对象:如Color.blue,Color.yellow,Color.orange,……见ColorExample.javaintred=0;intgreen=0;intblue=0;intgray=0;for(red=0;red=255;red+=16){g.setColor(newColor(red,green,blue));g.fillRect(red+16,16,15,15);}……赵志崑输出文字•将字符串输出到特定位置:–voiddrawString(Stringstr,intx,inty)(x,y)见TextExample.javag.drawString(HelloWorld!,50,50);g.drawString(世界你好!,50,100);赵志崑设置字体•设置当前字体:voidsetFont(Fontfont)•获取当前字体:FontgetFont()•Font的构造器:Font(Stringname,intstyle,intsize)–name:字体名称,可以用下面的方法获取系统支持的所有字体:•String[]GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()–style:字体形式,为Font.PLAIN,Font.BOLD,Font.ITALIC。–size:字体的高度,单位为像素。•这些设置字体的方法同样可以应用于组件上显示的字体。见FontExample.javapublicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.setFont(newFont(fontName,fontStyle,fontSize));g.drawString(HelloWorld!,50,50);g.drawString(世界你好!,50,100);}赵志崑见ImageExample.javaclassImagePanelextendsJPanel{privateImageunitsImage=null;privateintunitX;privateintunitY;publicImagePanel(){Toolkitkit=Toolkit.getDefaultToolkit();unitsImage=kit.getImage(globe.gif);}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.drawRect(10,10,100,100);g.drawImage(unitsImage,unitX,unitY,null);}publicvoidsetUnitLocation(intaX,intaY){unitX=aX;unitY=aY;repaint();}}绘制图像-1•drawImage(Imageimg,intdx,intdy,ImageObserverobserver)–将img中图片绘制到当前画布。globe.gifunitsImage赵志崑见ImageExample1.javapublicvoidpaintComponent(Graphicsg){……intsx1=118*unitIndex;intsy1=0;intsx2=sx1+117;intsy2=sy1+97;intdx1=unitX;intdy1=unitY;intdx2=dx1+117;intdy2=dy1+97;g.drawImage(unitsImage,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,null);}publicvoidsetUnitLocation(intaX,intaY){……unitIndex=(unitIndex+1)%4;repaint();}绘制图像-2•drawImage(Imageimg,intdx1,intdy1,intdx2,intdy2,intsx1,intsy1,intsx2,intsy2,ImageObserverobserver)–将img中的一个矩形区域绘制到当前画布的一个矩形区域,且可拉伸。–透明的部分不绘制(gif图片可以指定一个透明色),用于绘制不规则图像。unitsImageduke.gif(dx1,dy1)(dx2,dy2)(sx1,sy1)0123(sx2,sy2)11898赵志崑等待图像加载•问题:–Java加载图片文件(kit.getImage)的时候,采用异步的方式,即图片文件可能还没有加载完,getImage方法就返回了。这是为了适应网络速度慢下加载图片的时间比较长的情况。–此时,如果使用图片的数据,则是错误的。因此需要一种机制等待图片加载完成。•解决:–Java采用一个MediaTracker来跟踪图片的加载过程。见ImageExample1.javapublicImagePanel(){Toolkitkit=Toolkit.getDefaultToolkit();unitsImage=kit.getImage(duke.gif);MediaTrackertracker=newMediaTracker(this);tracker.addImage(unitsImage,0);try{tracker.waitForID(0);}catch(Exceptione){System.out.println(e);}}使用MediaTracker的方法:1、创建一个MediaTracker对象;2、用addImage方法将正在装入的图片加入到MediaTracker对象,并赋予一个编号;3、用waitForID(编号)方法等待图片装入完成。赵志崑Java支持的图片格式•Java支持三种图片格式:–JPEG:JointPhotographicExpertsGroup,支持全24位色彩。它是通过精确地记录每个像素的光亮但同时平均它们的色调的方法压缩图片,是有损压缩。–GIF:GraphicsInterchangeFormat,采用颜色索引的方式存储图片。一个GIF图片中只能有不多于256种的色彩,因此无法存储高质量照片。一个GIF文件可以包含几张图形以及每张图形的持续值,以产生动画效果。它也有有限度的可透明性:调色板中的某个色彩可被指定为透明色。–PNG:PortableNetworkGraphics,无损压缩,适合在网络中传播;具有8位、24位和32位三中色彩深度;支持Alpha通道透明(32位)和色彩索引透明(8位)。赵志崑Graphics2D•Graphics类是一个抽象类,所以pai
本文标题:Java程序设计12图形绘制
链接地址:https://www.777doc.com/doc-2881262 .html