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 绘制矩形 voiddrawRect intx inty intwidth intheight 绘制一个矩形 voidfillRect intx inty intwidth intheight 填充一个矩形 见GraphicsExample javag drawRect 10 20 60 50 g fillRect 80 20 60 50 绘制圆角矩形 voiddrawRoundRect intx inty intwidth intheight intarcWidth intarcHeight 绘制一个圆角矩形voidfillRoundRect intx inty intwidth intheight intarcWidth intarcHeight 填充一个圆角矩形 见GraphicsExample javag drawRoundRect 10 10 100 50 20 15 g fillRoundRect 160 10 100 50 20 15 arcHeight 绘制椭圆 voiddrawOval intx inty intwidth intheight 绘制一个椭圆voidfillOval intx inty intwidth intheight 填充一个椭圆 见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 绘制多边形 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 设置颜色 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 见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中图片绘制到当前画布 见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图片可以指定一个透明色 用于绘制不规则图像 unitsImage 等待图像加载 问题 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类是一个抽象类 所以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的图像将完全一样 见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某个位置取色 可以直接从BufferedImage对象同一个位置取 Buffere

温馨提示

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

评论

0/150

提交评论