要搞明白paint函数,首先要明白哪些类里面有paint?
通过查阅API发现:
java.awt.Component -java.awt.Container -javax.swing.JComponent中都有paint函数,但这几个paint函数是不同的。我们在这里主要关注的是JComponet中的函数。
API:
Paint
public void paint(Graphics g)
由 Swing 调用,以绘制组件。应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。
此方法实际上将绘制工作委托给三个受保护的方法:paintComponent、paintBorder 和 paintChildren。按列出的顺序调用这些方法,以确保子组件出现在组件本身的顶部。一般而言,不应在分配给边框的 insets 区域绘制组件及其子组件。子类可以始终只重写此方法。只想特殊化 UI(外观)委的 paint 方法的子类应该只重写 paintComponent.
在java中重写paint方法时,要在该方法中首先通过super.paint()调用父类的paint方法,这样才能保留原来的paint功能。
还有一段网上摘抄的话比较有意思,这也是从java文档中翻译过来的:
“轻量级”部件是怎样被绘制的
“轻量级”部件需要一个处在容器体系上的“重量级”部件提供进行绘画的场所。当这个“重量级”的“祖宗”被告知要绘制自身的窗体时,它必须把这个绘画的请求转化为对其所有子孙的绘画请求。这是由java.awt.Container的paint()方法处理的,该方法调用包容于其内的所有可见的、并且与绘画区相交的轻量级部件的paint()方法。因此对于所有覆盖了paint()方法的Container子类(“轻量级”或“重量级”)需要立刻做下面的事情:
public class MyContainer extends Container {
public void paint(Graphics g) {
// paint my contents first...
// then, make sure lightweight children paint
super.paint(g);
}
}
如果没有super.paint(),那么容器(container)的轻量级子孙类就不会显示出来(这是一个非常普遍的问题,自从JDK1.1初次引进“轻量级”部件之后)。
未完,待续中。。。。。