已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
graphics调用paint的一般是repaint()或当显示器刷新的时候调用的类似repaint()的类。当对于桌面执行了某类操作,改变了桌面上的图象时,jvm收到界面被调整的信息,此时会调用visible是ture的图形组件的repaint()方法对界面重绘。当然,直接重绘或全部重绘是很亏的,一个是用双缓存技术,另一个是只对桌面上显示的部分重绘。双缓存是指在缓存内先模拟重绘过程,只把最后成形的结果传给显示器显示。部分重绘就是指使用repaint(Dimension area)及类似的方法,只重绘与需调整的部分相关的界面。幸运的是,目前jdk提供的repaint()并不是傻呼呼的就直接重绘所有组件,已经用了上述两种方法优化过了。所以即使反复调用repaint()也不会有效率的损失。repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!paint()是提供给用户编程的,往往声明在接口之中,然后用户实现该接口,以拥有重绘的功能。若要定制某个图形组件的界面,可以重写paint()方法,记得一般习惯这样改写:void paint(Graphics g) super.paint(g); / your code除了paint(),有的组件会有paintBorder()之类的专门用于某个部分重绘的方法,不过一般是 protected 的,在对该类组件扩展的时候可以重写该方法。最后,graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics实例。一般graphics的实例会由依照你所在的桌面环境给出。Graphics类及其子类Graphics2D提供的只是一些基本绘图方法,比如画直线、曲线什么的。所以做一个图形组件的基本思路可以总结为以下过程:选择适合的基本图形组件 - 继承它 - 重写paint等方法 - 在需要刷新图形的时候调用repaint等方法!至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。-关于补充问题的补充答案:如果要找最终调用paint的地方的话,一定是通过repaint()方法。因为直接调用paint(),次数少还行,次数多就会导致该图形进程卡在与显示器的交互上,所以一定只有repaint才是可以被调用来重绘的。然而repiant存在的意义并不是绘界面,而是使绘界面操作更安全。可以看Component的repaint方法的实现,他将触发重绘的源放在AWTEventQueue里,然后等到图形处理的Queue有空的时候,自动拿出源,此时调用paint()。而paint的参数Graphics也只有此时能传给paint!因为Graphics与系统相关性太大,只能是通过JNI用底层代码实现,也就是C+代码创建。所以你要找到Graphics创建不能从jdk代码里找,要去找jvm的源代码(jdk6开源,你可以找找试试),可能会找到一些带有 Impl后缀的关于Graphics的实现。然后,如果深究 paint() 在哪调用, 我可以说,你所找到的jdk里所有带有paint()的代码段都不是最终paint被调用的地方。因为jdk只允许paint被repaint触发,而repaint到传递Event给AWTEventQueue后,所有的代码都变成系统相关,那么就不能从jdk里找到实现了。系统相关的处理,一般是在jdk只声明接口,然后利用反射机制动态创建。一般类名放在系统的环境变量中,然后反射该类,类的实现不同jvm不同。另外,你用jdk 5这些新版本的话,可以发觉jdk的swing机制给每个组件加了UI管理器,这样,实质在负责Component的界面的是他的updateUI()方法,使用该方法一定要先setUI()一下。UI机制有UIManager管理,UIManager你也找不到paint的源头。其本质也是将paint事件放入图形进程的队列。所以最后实现也是平台相关的。 6 谈谈java.awt.Graphics类图形环境的概念同在 GUI 平台上开发应用程序紧密相关。虽然通常将窗口和组件本身作为对象来表达,但仍然需要另一个接口来执行实际的绘制、着色以及文本输出操作。Java 语言中提供这些功能的基类称作 java.awt.Graphics。从 java.awt.Component 类(所有窗口对象的基类)继承的类提供了一个名为 paint() 的方法,在需要重新绘制组件时,调用该方法。paint() 方法只有一个参数,该参数是 Graphics 类的实例。Graphics 类支持几种确定图形环境状态的特性。以下列出了部分特性:1.Color:当前绘制颜色,它属于 java.awt.Color 类型。所有的绘制、着色和纯文本输出都将以指定的颜色显示。2.Font:当前字体,它属于 java.awt.Font 类型。它是将用于所有纯文本输出的字体。3.Clip:java.awt.Shape 类型的对象,它充当用来定义几何形状的接口。该特性包含的形状定义了图形环境的区域,绘制将作用于该区域。通常情况下,这一形状与整个图形环境相同,但也并不一定如此。4.ClipBounds:java.awt.Rectangle 对象,它表示将包围由 Clip 特性定义的 Shape 的最小矩形。它是只读特性。5.FontMetrics:java.awt.FontMetrics 类型的只读特性。该对象含有关于图形环境中当前起作用的 Font 的信息。6.Paint Mode:该特性控制环境使用当前颜色的方式。如果调用了 setPaintMode() 方法,那么所有绘制操作都将使用当前颜色。如果调用了 setXORMode() 方法(该方法获取一个 Color 类型的参数),那么就用指定的颜色对像素做“XOR”操作。XOR 具有在重新绘制时恢复初始位模式的特性,因此它被用作橡皮擦除和动画操作。 Graphics 类方法:可以将 java.awt.Graphics 支持的非特性方法划分为三个常规类别之下:1.跟踪形状轮廓的绘制方法: draw3DRect() drawArc() drawBytes() drawChars() drawImage() drawLine() drawOval() drawPolygon() drawPolyline() drawRect() drawRoundRect() drawString() 2.填充形状轮廓的绘制方法: fill3DRect() fillArc() fillOval() fillPolygon() fillRect() fillRoundRect() 3.诸如 translate() 之类的杂项方法,它们将图形环境的起点从其缺省值 (0,0) 变成其它值。 请注意,没有对任意形状进行操作的操作。直到 Java 2D 出现以前,图形操作一直都是很有局限性的。还需注意的是,对于渲染具有属性的文本也没有直接支持;显示格式化文本是一项费事的任务,需要手工完成。下面我们来看一些具体的实例(注:所有的实例都没有加上关闭窗口的事件驱动,只能用Ctrl+C来中断程序):1.画线程序:import java.awt.*;import java.awt.event.*;import java.util.*;class Main extends Frame Vector points = new Vector();int lastDrawnPoint = 0;Main() super(drawLine Example);setSize(200, 200);addMouseListener(new MouseEventHandler();addMouseMotionListener(new MouseMotionEventHandler();show();public void paint(Graphics g) Point curPt = null;for (int i=0; i Point pt = (Point)points.elementAt(i);if (curPt != null) g.drawLine(curPt.x, curPt.y, pt.x, pt.y);curPt = pt;lastDrawnPoint = points.size();public void update(Graphics g) Point curPt = null;lastDrawnPoint = Math.max(0, lastDrawnPoint-1);for (int i=lastDrawnPoint; i Point pt = (Point)points.elementAt(i);if (curPt != null) g.drawLine(curPt.x, curPt.y, pt.x, pt.y);curPt = pt;lastDrawnPoint = points.size();class MouseEventHandler extends MouseAdapter public void mousePressed(MouseEvent evt) points.addElement(evt.getPoint();repaint();class MouseMotionEventHandler extends MouseMotionAdapter public void mouseDragged(MouseEvent evt) points.addElement(evt.getPoint();repaint();static public void main(String args) new Main();Graphics.drawLine(int x,int y,int x2,int y2);是从一个点的坐标到另一个点的坐标。这个实例的运行结果也就是可以任意的画线。可以任意的拖动鼠标,我们知道,线都是由点构成的。我们的主程序是继承java.awt.Frame这个类,重载了paint()和update()这两个方法。而在主类添加了两个事件new MouseEventHandler()和MouseMotionEventHandler()。当我们运行程序结果时就能知道,paint()只是最初的调用,以后都是调用update(),而在MouseEventHandler()和MouseMotionEventHandler()中调用repaint()也是sun的程序员在内部已经嵌入的,所以这个不是我们需要担心的,程序的原理我想大家都明白的,用一个向量来保存鼠标的点,lastDrawnPoint是一个重要的变量,然后就不说了。2.调用图片程序:import java.awt.*;class Main extends Frame Image image;Main(String filename) super(drawImage Example);try image = getToolkit().getImage(filename);setIconImage(image); catch (Exception e) e.printStackTrace();setSize(400, 200);show();public void paint(Graphics g) Insets insets = getInsets();int x = insets.left, y = insets.top;int w = image.getWidth(this);int h = image.getHeight(this);/ originalg.drawImage(image, x, y, this); / shrinkeng.drawRect(x, y, w/4+1, h/4+1);g.drawImage(image, x+1, y+1, w/4, h/4, this);/ horizontally flippedg.drawImage(image, x+w, y, x+2*w, y+h, w, 0, 0, h, this);/ vertically flipped g.drawImage(image, x+2*w, y, x+3*w, y+h, 0, h, w, 0, this);/ enlarged; use -1 to indicate proportional heightg.drawImage(image, x+3*w, y, 2*w, -1, this);static public void main(String args) if (args.length = 1) new Main(args0); else System.err.println(usage: java Main );相比较上面的程序,这个程式就简单的多,它就是调用你本地的图片,进行多角度显示。java.awt.Frame.getToolkit().getImage(filename)和Graphics.drawImage()是重要的方法。3。画圆程式:import java.awt.*;import java.util.*;import java.io.*;class Main extends Frame Vector points = new Vector();Main() super(drawOval Example);setSize(200, 200);show();void addPoint(Point p) points.addElement(p);repaint();public void paint(Graphics g) Insets insets = getInsets();int x = insets.left, y = insets.top;for (int i=0; i Point p = (Point)points.elementAt(i);g.drawOval(x+p.x-5, y+p.y-5, 10, 10);static public void main(String args) Main m = new Main();BufferedReader dis = new BufferedReader(new InputStreamReader(System.in);while (true) try m.addPoint(new Point(Integer.parseInt(dis.readLine(),Integer.parseInt(dis.readLine(); catch (Exception e) e.printStackTrace();System.exit(1);这个程式也比较简单,不过他调用了个System.in来限制画圆的坐标。4画三角形:import java.awt.*;import java.awt.event.*;class Main extends Frame Polygon polygon = new Polygon();Main() super(drawPolygon Example);addMouseListener(new MouseEventHandler();addMouseMotionListener(new MouseMotionEventHandler();setSize(200, 200);show();public void paint(Graphics g) System.out.println(paint:);g.drawPolygon(polygon);/ The default update method clears the screen which causes / flicker. This override avoids this.public void update(Graphics g) System.out.println(update:);paint(g);class MouseEventHandler extends MouseAdapter public void mousePressed(MouseEvent evt) System.out.println(mousePressed:);polygon.addPoint(evt.getX(), evt.getY();repaint();class MouseMotionEventHandler extends MouseMotionAdapter public void mouseDragged(MouseEvent evt) System.out.println(mouseDragged:);polygon.addPoint(evt.getX(), evt.getY();repaint();static public void main(String args) new Main();画三角形是一个很有意思的东东。它注意是确定三个点了。第一个是最重要的。以后所有的三角形也这个为中心,如果你拖动鼠标的话,就会出现N多。5写字:import java.awt.*;import java.awt.event.*;class Main extends Frame implements ItemListener MainCanvas cv = new MainCanvas();Choice choice = new Choice();Main() super(drawString Example);for (int i=4; i60; i += 4) choice.add
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46667-2025基层兽医机构效能评估指南
- 脂肪烃生产工操作管理水平考核试卷含答案
- 珍珠岩制品工诚信品质知识考核试卷含答案
- 干酪素点制工安全实操考核试卷含答案
- 井下作业设备操作维修工道德竞赛考核试卷含答案
- 公司砖瓦干燥工岗位应急处置技术规程
- 起重机械维修工成果转化知识考核试卷含答案
- 语音文本介绍方案设计
- 自我介绍对外汉语
- 2025年菏泽市教师招聘参考题库及答案解析
- 2025年广西公需科目答案2卷(含答案)
- (更新版)国家开放大学电大本科《合同法》形考任务2及任务3试题答案
- 《电力无人机方案》课件
- 发电站安全课课件
- 2025年耳鼻喉医师面试题及答案
- 2025年生态环境执法大练兵比武竞赛理论考试题库(含答案)
- 2025安徽合肥水务集团有限公司招聘56人笔试考试备考试题及答案解析
- 污水处理厂管道安装施工方案
- 护理程序试题附答案
- 供应室清洗流程
- 《练习十九》习题课件
评论
0/150
提交评论