Java程序设计-12图形绘制_第1页
Java程序设计-12图形绘制_第2页
Java程序设计-12图形绘制_第3页
Java程序设计-12图形绘制_第4页
Java程序设计-12图形绘制_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机科学与技术学院赵志崑zhaozk@Java程序设计在组件上绘制图形图形可以绘制在任意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(); }}绘制图像-1drawImage(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();}绘制图像-2drawImage(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位)。Graphics2DGraphics类是一个抽象类,所以paintComponent(Graphicsg)方法中的参数g不可能是一个Graphics类型的对象。参数g实际上是Graphics的子类Graphics2D类型的对象。Graphics2D类提供的功能比Graphics类强大,包括:支持绘制更复杂的形状,如二次曲线、三次曲线;支持更复杂的坐标变换,如旋转等;支持设置线型,如实线、虚线、线条粗细;支持更复杂的填充方法,如多种颜色着色。要使用Graphics2D类的功能时,可以直接进行造型。publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); Graphics2Dg2=(Graphics2D)g;

…… //g2支持Graphics2D类的所有方法}缓冲区绘图问题:Graphics类没有能够取得某一点的颜色的方法。组件没有将图片保存到文件的方法。解决:BufferedImage类(Image类的子类)有取色功能(getRGB方法)和保存到文件功能。采用双缓冲区绘图的方法,将BufferedImage和JPanel联系起来:创建一个BufferedImage对象,作为后台绘图缓冲区;所有绘图操作均在BufferedImage对象上进行;绘制完成后,将BufferedImage对象整个绘制到JPanel上;这样,BufferedImage对象和JPanel的图像将完全一样。globe.gif(文件)unitImage(Image)backBuffer(BufferedImage)Graphicsg(JPanel的paintComponent方法)见DoubleBufferExample.javaclassPhotoPanelextendsJPanel{privateBufferedImagebackImage=newBufferedImage(1024,800, BufferedImage.TYPE_BYTE_INDEXED);publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); GraphicsbackG=backImage.getGraphics(); backG.drawImage(photoImage,0,0,null); g.drawImage(backImage,0,0,null); backG.dispose();}publicColorgetColor(intx,inty){ intc=backImage.getRGB(x,y); returnnewColor(c);}}读取图像数据采用双缓冲区绘图的方法后,将BufferedImage和JPanel的图像完全相同。因此,若想从JPanel某个位置取色,可以直接从Buffered

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论