【发布时间】:2014-03-03 23:29:06
【问题描述】:
我目前正在开发一个绘图程序,并且已经实现了撤消和重做方法,但是由于我的程序在用户绘图时速度变慢,我决定不将坐标存储在 ArrayList 中,而是直接将它们应用到缓冲图像。这种方法的问题是我不能像以前那样撤消或重做。 我在互联网上四处搜索,发现一个名为UndoManager 的类的引用。不过,我不知道如何将其应用于图形对象(鉴于我的情况)。
我仍然可以存储坐标,但这对我来说毫无用处,因为我直接在上面绘制它们,除非有人能想出一种方法来覆盖黑色线条和透明线条来替换它(目前,对于为此,我使用了 BufferedImage.setRGB(x,y,color),但这仅在我要替换的形状是圆形 (x^2 + y^2 = r^2) 或矩形时才有用。
有什么想法吗?
【问题讨论】:
-
你是如何创建 ArrayList 的?您是否尝试过使用 LinkedList?
-
@MadProgrammer 我曾经使用过 AL,但是当我实现了橡胶工具(由于画布是透明的而必须使用 BuffImg.setPixel 而不是 G2D.drawLine)时,性能急剧下降,因为我必须为每次点击或拖动设置像素 rrpi 时间,其中 r 是可变的,包括所有其他笔划。
-
@MadProgrammer 我刚读了这个thread,发现LinkedList 比AL 慢。你问的原因是什么?
-
LinkedList如果您不想要顺序访问,则速度较慢,它的增长能力更快,因为它不需要不断重新分配后备缓冲区,因此它不会创建很多需要被垃圾收集。正如我所看到的,您只是推送和弹出列表并运行线性访问(从列表的开头到结尾运行),LinkedList实际上可能会给您带来更好的性能。 -
您还可以减少撤消操作的概念,因此如果用户按下鼠标按钮并执行拖动操作,我会认为在释放鼠标之前,这将构成单个行动。作为一个想法,我可能更容易将您需要绘制的内容与被认为是“撤消”的操作区分开来
标签: java swing graphics graphics2d