gpt4 book ai didi

java - 从 PaintComponent 调用 repaint 是一个好习惯吗

转载 作者:行者123 更新时间:2023-12-03 03:05:32 25 4
gpt4 key购买 nike

对于应用程序中的某些 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 是不好的做法,因为:

  1. 几乎不需要这样的高帧速率
  2. 不保证帧速率(重绘不会直接调用绘画方法,而是导致尽快调用该组件的绘制方法(可能不会立即))<
  3. 将优先级放在单个组件的绘制上,不仅会导致该组件的绘制性能不佳,而且还会导致其他组件的绘制以及对其他 EDT 特定任务的响应性能不佳(例如事件)

Is it better to use a Timer or a background thread to repaint our components?

是的,使用TimerThread可以让您更好地控制帧速率,而不会在这样做时使EDT陷入困境。根据上下文,Timer 在 EDT 上运行(而不是线程),因此不需要分派(dispatch)到 EDT。

关于java - 从 PaintComponent 调用 repaint 是一个好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com