调用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事件放入图形进程的队列。所以最后实现也是平台相关的。
分享到:
相关推荐
它扩展了Graphics类,提供了更多的绘图属性和方法,使得开发者能够进行更精细的图形控制。在Java中,Graphics2D类的绘图属性主要包括stroke属性、paint属性、transform属性、clip属性和composit属性。下面我们将详细...
Graphics2D是Java 2D API的一部分,它提供了丰富的绘图和图形操作功能,包括添加水印到图像。下面将详细介绍如何使用Java Graphics2D实现文字和图片水印,以及如何在四个角落添加水印。 首先,我们要导入必要的Java...
使用Java Graphics2D类生成心跳曲线坐标图,一般用于在服务器端生成坐标对数据图片,示例可以参考这里:https://blog.csdn.net/youxijishu/article/details/124545372?spm=1001.2014.3001.5502
通过制作烟花的实例,运用了Java2中的界面技术和线程技术。通过界面技术,制作出烟花的形状。通过线程技术,控制烟花的播放场景和播放时间。...本实例的知识点有:鼠标事件的监听,Graphics类和Thread类的应用。
它扩展了基础的Graphics类,提供了更多的特性,如几何形状的绘制、坐标转换、颜色管理以及文本布局。在Java中,如果你需要生成验证码、绘制复杂的图表或者进行其他高级的图形渲染,Graphics2D就是不可或缺的工具。 ...
Java中的`Graphics`类是Java 2D API的核心部分,用于在Java图形用户界面(GUI)上进行绘制。`Graphics`类提供了各种方法,如绘制直线、曲线、文本、图像等基本图形。在这个讨论中,我们将深入理解Java GUI重绘机制、...
在Java图形处理中,`Graphics2D`是用于绘制2D图形的主要类,它提供了丰富的功能来绘制各种形状,包括直线。在Java中,直线的绘制主要通过`java.awt.geom`包中的`Line2D`类实现。`Line2D`是一个抽象基类,提供了多种...
在Java中,我们可以使用`java.awt.Polygon`类来创建自定义形状,如扇形,代表饼图的各个部分。同时,`java.awt.geom`包中的`Arc2D`类可以方便地绘制弧形,进一步简化了饼图的绘制过程。我们需要计算每个扇形的起始...
总的来说,这个项目展示了如何使用Java的Graphics2D接口和枚举来实现流程图的绘制,并通过封装类和工具类来提高代码的复用性和可扩展性。通过这样的方式,开发者可以轻松创建和修改流程图,满足不同的业务需求,同时...
在Java编程语言中,`Graphics`类是图形绘制的核心,它提供了一系列方法来在屏幕上创建各种形状、线条、文本和图像。本篇文章将深入探讨如何使用`Graphics`类进行基本的图形绘制,主要包括直线和矩形的绘制。 首先,...
【作品名称】:基于Java Graphics2D生成各类圆形/椭圆公章、私章图片 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...
标题中的"Opt_Alg.rar_Java Graphics_barnel4_java"暗示了这是一个关于优化算法(Opt_Alg)的Java编程项目,特别关注图形处理(Java Graphics)和可能的一个特定算法实现,如barnel4,这可能是作者或项目特有的命名...
2. **Java Graphics类**: Java的`java.awt.Graphics`类是进行图形绘制的基础,它提供了各种方法,如`drawLine()`, `fillRect()`, `drawOval()`等,用于在屏幕上绘制线条、形状和图像。通过`Graphics`对象,我们...
Java标准库提供了Graphics类,允许在窗口应用程序中绘制图形。这涉及到AWT(Abstract Window Toolkit)或Swing库,它们提供了丰富的图形绘制功能,如画线、填充形状、设置颜色等。但这超出了控制台打印的范围,更...
2. **Java Graphics类** `java.awt.Graphics`类是Java中用于绘制的基本类,它提供了各种方法如`drawLine()`, `fillRect()`, `drawOval()`等,用于在组件上绘制2D图形。通过继承`java.awt.Component`或使用`...
Graphics类是Java绘图的核心,它包含了各种绘图方法,如drawLine(), fillRect(), drawString()等。这些方法允许我们在屏幕上绘制线条、形状和文本。Graphics对象通常由系统提供,我们可以通过组件的getGraphics()...
Java的GUI编程中,Graphics类是进行图形绘制的基础,它提供了丰富的绘图功能,使得开发者可以在屏幕上绘制各种形状和图像。Graphics类包含了多种方法,用于画线、画矩形、画圆、画椭圆以及画多边形等,是Java AWT...
"我的卡丁车"是一款基于Java编程语言开发的图形化游戏,主要利用Java的Graphics类进行图像绘制。在Java中,Graphics是Java AWT(Abstract Window Toolkit)库中的核心类,用于在窗口或图形组件上进行绘图操作。这个...
它扩展了 `java.awt` 包中定义的 `Graphics` 类和 `Image` 类,提供了高性能的二维图形、图像和文字处理能力,并保持了对现有的 AWT 应用的兼容性。 ##### 二、AWT 图形能力的不足 在 AWT 最初的实现中,图形能力...
Java中的Graphics2D API是Java 2D图形库的核心部分,它提供了丰富的功能来绘制复杂的二维图形和文本。在Java.awt.geom包中,有一系列的类用于创建和操作各种几何图形,包括直线、矩形、圆角矩形、椭圆、圆弧、二次...