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

时间:2017-06-09 13:53:06

标签: 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覆盖了paint方法,当发生对creep状态的更改时,它调用了creepsView.repaint()方法,但随后调用了boardview.paint() JLayeredPane,我不明白为什么。我怎么能避免呢? (我不想重绘那些没有改变的东西。)

1 个答案:

答案 0 :(得分:2)

  

我想这是因为它再次重新粉刷背景板。

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

  

,它正在调用creepsView.repaint()方法,然后由JLayeredPane调用boardview.paint

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

您可以尝试仅通过绘制面板的受影响区域来提高绘画效率。这不是重新绘制整个玩家面板,而是只重新映射玩家的旧位置和新位置。阅读Custom Painting上Swing教程中的部分,了解此方法的示例。 moveSquare(...)方法显示了此方法的工作原理。