在 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();
}
...
}
此题与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();
}
...
}