Summary
-
在 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
。