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

标签 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();
        }
    }
}

这是一个好的做法吗(特别是在性能/效率/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/

相关文章:

java - 如何通过Java swing执行cmd命令

java - 检查日期是否早于 x 天(仅限工作日)

java - JSF ConvertNumber 抛出 java.lang.IllegalArgumentException : argument type mismatch Error

python - Keras网络训练速度下降

java - 如何减少 Full GC 的数量?

java - 如何在JTree java swing中显示BinaryTree

java - Java/Swing 有什么好的 "cube grid"组件吗?

java - 如果元素类型为 <object></object>,如何使用 Selenium(对于 Java)定位输入文本框

java - hashCode() 必须返回素数吗?

java - 使用 ThreadPoolExecutor 缩放 maxPoolSize;为什么池不会动态增加其大小?