Summary

  • 在 Swing 中,绘画从paint方法开始,然后调用paintComponentpaintBorderpaintChildren。当组件首次被绘制,调整大小或在被另一个窗口隐藏后暴露时,系统将自动调用此功能。

  • 程序性重画是通过调用组件的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