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

Java Swing JLayeredPane停止重新绘制所有图层,java,swing,jlayeredpane,Java,Swing,Jlayeredpane,我正在尝试用Swing制作一个游戏,我需要制作一个有玩家的棋盘,所以我使用了JLayeredPane。在第0层我画了棋盘,然后在第1层我画了球员。 这很有效,但问题是当我重新绘制第1层时(例如,更改给定玩家的位置),性能非常差。我的假设是它正在重新粉刷背景板,这是问题的根源。 代码如下: JLayeredPane layeredPane = new JLayeredPane(); layeredPane.add(boardView, new Integer(0)); layeredPane.ad

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

JLayeredPane layeredPane = new JLayeredPane();
layeredPane.add(boardView, new Integer(0));
layeredPane.add(creepsView, new Integer(1));
crewsview
boardView
覆盖绘制方法,当爬行状态发生变化时,它会调用
crewsview.repaint()
方法,但随后JLayeredPane会调用
boardView.paint()
。我怎样才能避免呢?(我不想重画那些没有改变的东西)

我猜是因为它在重新粉刷背景板

我怀疑这是个问题,因为画一个载入内存的图像是非常有效的

,它将调用crewsview.repaint()方法,然后JLayeredPane将调用boardview.paint

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

您可以尝试通过仅绘制面板的受影响区域来提高绘制效率。也就是说,您只需在旧位置和新位置重新绘制播放器,而不是重新绘制整个播放器面板。有关此方法的示例,请阅读上Swing教程的部分。
moveSquare(…)
方法显示了这种方法的工作原理

我猜是因为它在重新粉刷背景板

我怀疑这是个问题,因为画一个载入内存的图像是非常有效的

,它将调用crewsview.repaint()方法,然后JLayeredPane将调用boardview.paint

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

您可以尝试通过仅绘制面板的受影响区域来提高绘制效率。也就是说,您只需在旧位置和新位置重新绘制播放器,而不是重新绘制整个播放器面板。有关此方法的示例,请阅读上Swing教程的部分。
moveSquare(…)
方法显示了这种方法的工作原理