文档

Java™教程
隐藏目录
更详细了解绘画机制
导航: 使用Swing创建GUI
课程: 执行自定义绘制

深入了解绘制机制

到目前为止,您已经知道paintComponent方法是放置所有绘制代码的位置。的确,当绘制时间到来时,这个方法将被调用,但实际上绘制从类层次结构的更高层次开始,即paint方法(由java.awt.Component定义)。每当需要渲染您的组件时,绘制子系统将执行此方法。其签名为:

javax.swing.JComponent扩展了这个类,并将paint方法进一步分解为三个独立的方法,按照以下顺序调用:

API没有阻止您的代码重写paintBorderpaintChildren,但一般来说,您没有理由这样做。对于所有实际目的而言,paintComponent将是您唯一需要重写的方法。

如前所述,大多数标准Swing组件的外观和感觉由单独的UI委托实现。这意味着大多数(或全部)标准Swing组件的绘制过程如下所示。

  1. paint()调用paintComponent()
  2. 如果ui属性非空,paintComponent()调用ui.update()
  3. 如果组件的opaque属性为true,ui.update()用背景颜色填充组件的背景并调用ui.paint()
  4. ui.paint()渲染组件的内容。

这就是为什么我们的SwingPaintDemo代码调用super.paintComponent(g)。我们可以添加一个额外的注释来更清楚地说明:

public void paintComponent(Graphics g) {
    // 让UI Delegate先绘制,包括
    // 填充背景,因为
    // 这个组件是不透明的。

    super.paintComponent(g);       
    g.drawString("This is my custom Panel!",10,20);
    redSquare.paintSquare(g);
}  

如果您已经理解了本课程中提供的所有演示代码,恭喜!您拥有足够的实际知识来在自己的应用程序中编写高效的绘制代码。然而,如果您想更深入地了解“底层工作原理”,请参阅本课程第一页链接的SDN文章。


上一页: 设计的完善
下一页: 摘要