如何在具有撤消功能的缓冲区上绘图?

Vin*_*arg 4 java swing buffer jpanel graphics2d

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

对于持久性,我可以将所有命令存储在列表中,在
public void paintComponent(Graphics g)JPanel中我逐个绘制它们.
但这是非常低效的,因为每次遍历列表并使用哈希映射来调用(或调度)相关的形状绘图界面.

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

另外有一种方便的方法可以使用缓冲区撤消以前的绘制吗?或者每次撤消时我是否需要重绘缓冲区?

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

tra*_*god 6

JPanel默认情况下是双缓冲,因此选择和拖动通常非常流畅.GraphPanel是一个简单的对象绘制程序,它说明了对a的这种操作List<Node>.类似的方法已成功用于数千个节点.

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

附录:渲染大量对象的一种常见优化方法是使用flyweight模式.JTable,JFreeChart并且JGraph是例子.这简化example说明了基本机制.