Java 如何利用具有撤消功能的缓冲区?

Java 如何利用具有撤消功能的缓冲区?,java,swing,buffer,jpanel,graphics2d,Java,Swing,Buffer,Jpanel,Graphics2d,虽然我没有做一些动画或绘制非常复杂的图形。 我需要(某种)双缓冲来绘制几个基本体。在应用程序中,用户输入形状名称,后跟相关参数,然后在缓冲区上绘制形状,然后在屏幕上绘制。 命令的示例是RECT 100、50、200、120 为了持久化,我可以将所有命令存储在列表和 JPanel的公共组件(图形g)我一个接一个地画出来。 但这是非常低效的,因为每次遍历列表并使用哈希映射来调用(或分派)相关的图形绘制接口 如何以及在什么类型的缓冲区上绘制?不同的方法如何利用这个缓冲区 此外,是否有一种方便的方法可以

虽然我没有做一些动画或绘制非常复杂的图形。
我需要(某种)双缓冲来绘制几个基本体。在应用程序中,用户输入形状名称,后跟相关参数,然后在缓冲区上绘制形状,然后在屏幕上绘制。 命令的示例是
RECT 100、50、200、120

为了持久化,我可以将所有命令存储在列表和
JPanel的公共组件(图形g)我一个接一个地画出来。
但这是非常低效的,因为每次遍历列表并使用哈希映射来调用(或分派)相关的图形绘制接口

如何以及在什么类型的缓冲区上绘制?不同的方法如何利用这个缓冲区

此外,是否有一种方便的方法可以使用缓冲区撤消以前的绘图?还是每次撤消时都需要在缓冲区上重新绘制

谢谢,我不想要完整的代码,但是相关的类名和小的伪代码是值得赞赏的。

默认情况下是双缓冲的,所以选择和拖动通常非常平滑。是一个简单的对象绘制程序,它在
列表中演示了此类操作。类似的方法已成功用于数千个节点

实现撤销策略的细节在很大程度上取决于所需的行为,但是
remove()
repaint()
是有效的


附录:渲染大量对象的一个常见优化使用,这些都是例子。这一简化说明了基本的机制。

您能否详细说明您的效率标准<代码>列表
通常可以绘制数千个形状。@trashgod:不应该有闪烁,而且每次切换应用程序时绘制,不应该要求绘制paintComponent内部的所有内容。“不应该要求绘制所有内容”研究“过早优化”。@AndrewThompson:抱歉,但我最后的经验是(关于绘制试验板)不是很好。所以我有点担心。“所以我有点担心。”你应该发布一点。注意:
remove()
应该通过相应的
列表迭代器来完成,尽管我忘记在前面添加注释。它可能会帮助我学习绘图的基础知识:-)