在 GlassPane 重绘上防止 RootPane 重绘

Preventing RootPane repaint on GlassPane repaint

此题与Paint on a glass pane without repainting other components类似。但是我不知道如何应用那里提供的解决方案。

我的问题是我们有一个非常复杂的 RootPane,有很多组件,并且重新绘制它很昂贵。我们在 JFrame 的 GlassPane 上也有一个动画 运行。我注意到动画的每个滴答声都在按应有的方式重新绘制动画,但随后也会导致底层 RootPane 上的所有内容也被重新绘制。

我已经尝试用各种代码覆盖 RootPane 的 paint() 方法,但它总是导致 RootPane 上的组件被擦除和大量闪烁,这可能是因为子组件试图将自己重新绘制为事物动画期间更新:

pnlContent = new JRootPane() {
   @Override
   public void paint(Graphics g) {
      OurGlassPaneWithAnimation glass = ...
      if (glass != null && glass.animation != null && glass.animation.isAlive()) {
         //Animation running, do something cool so root pane still looks good without repainting out the wazoo
      } else { super.paint(g); }
   }
};

也许将动画放在 GlassPane 中是个坏主意?我们已经考虑将其改为位于居中的 JPanel 中。或者是否有一种使用 GlassPane 并将对背景 RootPane 的重绘保持在最低限度的好方法?

@MadProgrammer 感谢您提出重绘(矩形)而不只是重绘()解决问题的建议。现在我们可以将动画 fps 调高到我们想要的那么高,并且它不会显着影响其后面的 RootPane 的加载时间。这是代码片段。

while (keepOnAnimating) {
   BufferedImage bi = vFrames.elementAt(0);
   if (bi != null) {
      // This only repaints area of image rect
      // Prevents lots of repaints from happening in rootpane behind glasspane.
      int x = getWidth() / 2 - bi.getWidth() / 2;
      int y = getHeight() / 2 - bi.getHeight() / 2;
      jc.repaint(x, y, bi.getWidth(), bi.getHeight());
  } else {
     jc.repaint();
  }
  ...
}