# 小结

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/painting/summary.html](https://docs.oracle.com/javase/tutorial/uiswing/painting/summary.html)

*   在 Swing 中，绘画以`paint`方法开始，然后调用`paintComponent`，`paintBorder`和`paintChildren`。当组件首次被绘制，调整大小或被另一个窗口隐藏后变为暴露时，系统将自动调用此方法。
*   通过调用组件的`repaint`方法完成程序重绘。 _ 不是 _ 直接调用`paintComponent`。调用`repaint`会使绘制子系统采取必要的步骤，以确保在适当的时间调用`paintComponent`方法。
*   `repaint`的多参数版本允许您缩小组件的 _ 剪辑矩形 _（受绘画操作影响的屏幕部分），以便绘画变得更有效。我们在`moveSquare`方法中使用了这种技术，以避免重新绘制未更改的屏幕部分。此方法还有一个无参数版本，它将重新绘制组件的整个表面区域。
*   因为我们缩小了剪辑矩形，我们的`moveSquare`方法不会调用`repaint`一次，而是调用两次。第一次调用重新绘制以前之前的方块 _ 所在的组件区域（继承的行为是用当前背景颜色填充区域。）第二次调用绘制正方形组件的区域 _ 目前 _ 是。_
*   您可以在同一个事件处理程序中多次调用`repaint`，但 Swing 将获取该信息并在一次操作中重新绘制该组件。
*   对于具有 UI 委托的组件，您应该将`Graphics`参数与行`super.paintComponent(g)`作为`paintComponent`覆盖中的第一行代码传递。如果不这样做，那么您的组件将负责手动绘制其背景。您可以通过注释掉该行并重新编译来查看背景不再被绘制来进行实验。
*   通过将我们的新代码分解为单独的`RedSquare`类，应用程序维护面向对象的设计，这使得`MyPanel`类的`paintComponent`方法不会混乱。绘画仍然有效，因为我们通过调用`paintSquare(Graphics g)`方法将`Graphics`对象传递到红色方块。请记住，此方法的名称是我们从头开始创建的名称;我们没有从 Swing API 中的任何地方覆盖`paintSquare`。