对于应用程序中的某些 UI 组件,我们会重写 paintComponent
,它在某些情况下通过调用 repaint
来“递归”调用自身。我们使用这种方法来实现组件中动画的高刷新率。
例如,我们使用的进度条看起来像:
public class SimpleProgressBar extends JPanel {
private boolean inProgress;
....
@Override
protected void paintComponent(Graphics g) {
if (inProgress) {
paintBar(g);
repaint();
} else {
doSomeOtherThings();
}
}
}
这是一个好的做法吗(特别是在性能/效率/CPU 使用方面)?
使用定时器
还是后台线程来重绘
我们的组件更好?
最佳答案
Is this a good practice (especially in terms of performance / efficiency / CPU usage)?
不,这不是一个好的做法。从 paintComponent
内部调用 repaint 是不好的做法,因为:
- 几乎不需要这样的高帧速率
- 不保证帧速率(重绘不会直接调用绘画方法,而是导致尽快调用该组件的绘制方法(可能不会立即))<
- 将优先级放在单个组件的绘制上,不仅会导致该组件的绘制性能不佳,而且还会导致其他组件的绘制以及对其他 EDT 特定任务的响应性能不佳(例如事件)
Is it better to use a Timer or a background thread to repaint our components?
是的,使用Timer
或Thread
可以让您更好地控制帧速率,而不会在这样做时使EDT陷入困境。根据上下文,Timer
在 EDT 上运行(而不是线程),因此不需要分派(dispatch)到 EDT。
关于java - 从 PaintComponent 调用 repaint 是一个好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561690/