Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免重画整个迷宫的最佳方法?_Java_Swing_Java 2d_Maze - Fatal编程技术网

Java 避免重画整个迷宫的最佳方法?

Java 避免重画整个迷宫的最佳方法?,java,swing,java-2d,maze,Java,Swing,Java 2d,Maze,我正在做一个使用Java、swing和Java2D生成迷宫的项目。我对Java2D相当陌生,所以如果这个问题是新手,请原谅 基本上,我有一个成功生成的迷宫。我希望在一个自定义JPanel上绘制这个迷宫,我已经设置好并正确地覆盖了这个组件。我现在的问题是我现在有能力画迷宫,但每次我重新画它时,它就消失了。我已经解决了这个问题,每次调用repaint()时都让它重新绘制迷宫,但这似乎效率极低。既然迷宫没有改变,我为什么要重画呢 所以我的问题是:有没有办法“缓存”迷宫的绘图,这样我就不必每次都浪费时间

我正在做一个使用Java、swing和Java2D生成迷宫的项目。我对Java2D相当陌生,所以如果这个问题是新手,请原谅

基本上,我有一个成功生成的迷宫。我希望在一个自定义JPanel上绘制这个迷宫,我已经设置好并正确地覆盖了这个组件。我现在的问题是我现在有能力画迷宫,但每次我重新画它时,它就消失了。我已经解决了这个问题,每次调用repaint()时都让它重新绘制迷宫,但这似乎效率极低。既然迷宫没有改变,我为什么要重画呢

所以我的问题是:有没有办法“缓存”迷宫的绘图,这样我就不必每次都浪费时间重画了?我可以看到每次都会重新绘制,因为超大的迷宫是减速的主要来源


谢谢大家!

将迷宫绘制到缓冲区图像。然后在paintComponent()方法中,只需绘制BuffereImage。Swing将决定是否需要重新绘制整个迷宫或只是其中的一部分


有关在BuffereImage上绘制的示例,请参见中的
DrawOnImage
示例。

如果迷宫从未更改,您可以首先将其绘制到一个图形中。通过创建缓冲区图像并在其上调用
image.createGraphics()
以获取
Graphics2D
对象,可以使用编写的覆盖
paintComponent
的代码。对从
createGraphics()
返回的
Graphics2D
对象所做的任何绘制都将添加到
buffereImage
中。您可能需要将迷宫的先前绘图代码提取到它自己的函数中,该函数接受一个
Graphics2D
对象并绘制到它


将迷宫绘制到
BufferedImage
中后,可以使用
Graphics
Graphics2D
中的任何
drawImage()
函数。这避免了必须重新绘制迷宫:现在您只需绘制已渲染的图像。

如果在
paintComponent
中绘制时首先调用
super。paintComponent
双缓冲不应提供绘制效果。绘图时没有太多的创建或其他昂贵的操作,paintComponent中没有重新绘制。重新绘制的次数越少,
重新绘制(50L)
越好。