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

标签 java swing jlayeredpane

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

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

creepsViewboardView 重写绘制方法,当 Creeps 状态发生更改时,它会调用 creepsView.repaint()方法,但随后 JLayeredPane 调用了 boardview.paint() ,我不明白为什么。我怎样才能避免它? (我不想重画那些没有改变的东西)。

最佳答案

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(...) 方法展示了这种方法的工作原理。

关于java - Swing JLayeredPane 停止重新绘制所有图层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44459620/

相关文章:

java - GWT。排除共享域对象以分离 Maven 模块

java - Java SE 应用程序生命周期是什么......或者它没有生命周期?

java - SWING 应用程序挂起,消耗大量 CPU

java - JComboBox 应用程序中的 ArrayIndexOutOfBoundsException

java - JPanel 中新的不可见层

java - 使用 Java 仅更新现有 Google Drive 文件的元数据

c# - Camel 套管的缩写?

java - 在 Eclipse 中发现从 Android 的方向 API JSON 数据中提取 html_instructions 的困难

java - 多个 JPanel 在 JLayeredPane 中绘制图像

java - 创建带有背景图像的表单(JLayeredPane)