【问题标题】:PaintComponent Takes a Long Time, Ties up the Swing Event Dispatch ThreadPaintComponent 耗时较长,占用 Swing 事件调度线程
【发布时间】:2026-01-14 15:45:01
【问题描述】:

我已经定制了一个显示大型复杂图表的 JPanel。根据数据的大小,在paintComponent() 中渲染可能需要几分钟。我正在寻找以下策略:

  • 在不占用事件调度线程的情况下绘制组件。
  • 在 JPanel 中绘制一些内容,让用户知道正在呈现图像。
  • 定期更新另一个容器的标签以显示进度

我对此进行了一些研究,我想知道是否正确的策略是使用 SwingWorker 创建后台线程并绘制到 BufferedImage。计时器将处理状态更新。类成员变量将保持状态。

我走对了吗?

【问题讨论】:

    标签: java performance swing jpanel


    【解决方案1】:

    您需要考虑使用SwingWorker。您应该在单独的线程中渲染图表。 SwingWorker 将有助于实现这一目标。

    要开始使用并发多线程,sun 有一个great tutorial,应该会很有帮助。

    【讨论】:

      【解决方案2】:

      使用由特殊工作线程更新的背景图像。然后在 JPanel 的 paintComponent() 方法中绘制这个图像。该策略称为双缓冲。你有背景和前景图像。如果单独的线程完成数据的绘制,则将此图像设置为前景,将前景加载为背景。如有必要,使 JPanel 无效并继续在背面图像上绘画。

      【讨论】: