Swing JLayeredPane 停止重新绘制所有图层

Swing JLayeredPane stop repainting all layers

我正在尝试用 Swing 制作游戏,我需要制作一个棋盘上有玩家的棋盘,所以我使用了 JLayeredPane。在第 0 层我画了棋盘,然后在第 1 层我画了球员。 这很好用,但问题是当我重绘第 1 层(例如更改给定玩家的位置)时,性能非常糟糕。我的假设是它再次重新粉刷背景板,这是导致问题的原因。 这是代码:

JLayeredPane layeredPane = new JLayeredPane();
layeredPane.add(boardView, new Integer(0));
layeredPane.add(creepsView, new Integer(1));

creepsViewboardView 覆盖了 paint 方法,当 creep 的状态发生变化时,它调用 creepsView.repaint() 方法,但是 boardview.paint() 是由 JLayeredPane 调用,我不明白为什么。我怎样才能避免它? (我不想重画没有改变的东西)。

I guess it's because it's repainting the background board again.

我怀疑这是问题所在,因为绘制加载到内存中的图像非常有效。

, it's calling the creepsView.repaint() method and then the boardview.paint is called by the JLayeredPane

为了让您看到背景,这意味着包含玩家的面板必须是透明的。这意味着当您重新绘制播放器面板时,背景面板也必须重新绘制以确保没有绘制瑕疵。例如,必须将玩家从其旧位置移除并在新位置绘画。

您可以尝试只绘制面板受影响的区域来提高绘制效率。这不是重新绘制整个播放器面板,而是只在其旧位置和新位置重新绘制播放器。阅读 Swing 教程中关于 Custom Painting 的部分,以获取此方法的示例。 moveSquare(...) 方法展示了这种方法的工作原理。