从paintComponent调用repaint是一个很好的做法

Eli*_*ist 2 java performance swing awt

对于我们应用程序中的一些UI组件,我们覆盖paintComponent,在某些情况下"递归地"通过调用来调用自身repaint.我们使用这种方法来实现组件中动画的高刷新率.

例如,我们使用的进度条看起来像:

public class SimpleProgressBar extends JPanel {
    private boolean inProgress;

    ....

    @Override
    protected void paintComponent(Graphics g) {
        if (inProgress) {
            paintBar(g);
            repaint();
        } else {
            doSomeOtherThings();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的做法(特别是在性能/效率/ CPU使用方面)?
在组件中使用Timer或后台线程更好repaint吗?

cop*_*peg 6

这是一个很好的做法(特别是在性能/效率/ CPU使用方面)?

不,这不是好习惯.从内部调用重绘paintComponent是不好的做法,因为:

  1. 这样的高帧率几乎从不需要
  2. 帧速率无法保证(重绘不会直接调用绘制方法,但会导致尽快调用此组件的绘制方法'(可能不会立即调用))
  3. 优先考虑单个组件的绘制,并且不仅可能导致该组件的绘制,而且还会导致其他组件的绘制以及对其他EDT特定任务(例如事件)的响应

使用Timer或后台线程重新绘制组件是否更好?

是的,使用Timer或者Thread可以更好地控制帧速率,而不会在执行此操作时阻碍EDT.根据上下文,Timer在EDT上运行(而不是线程),因此不需要调度到EDT.