堆溢出在Swing应用程序中实现撤消

时间:2012-12-20 07:27:21

标签: java swing undo

我正在java swing中开发一个涂鸦类型的应用程序。它处于初级阶段并在此处显示。

Scribble Board

我已经实现了撤消功能,它可以撤消最后绘制的笔划。撤消功能可以达到最大定义的撤消级别。

撤消功能的工作原理是在Image array中每次描边后复制绘图画布的内容。 此数组的行为类似于First-In-Last-Out堆栈。单击撤消时,堆栈为poped 并在屏幕上绘制获得的图像。

现在我面临的问题是,当前的undo实现方法占用了太多的内存。在撤消级别为20时,几乎70-80 MB的内存用完,而在30级时,会发生堆溢出。

有没有更好的方法来实现撤消功能?感谢。

编辑:我找到了一些可能有用的有用信息here

1 个答案:

答案 0 :(得分:2)

您需要以不同方式表示图形中的步骤。在您正在使用的当前方法中,每次重新将Canvas保存为未压缩的图片 - 这就是内存贪婪。

尝试重构代码,以便只将在Canvas上绘制的笔划保存到堆栈中。这将在渲染图片时增加一些开销(每次发生更改时都需要重绘整个画布),但Java旨在解决这个问题。

仅保存形状后,内存要求应显着降低。使用Shape类来表示画布上的笔画。