【问题标题】:How to draw on a buffer with Undo capability?如何在具有撤消功能的缓冲区上绘图?
【发布时间】:2012-03-10 00:00:22
【问题描述】:

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

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

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

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

谢谢,我不想要完整的代码,但感谢相关的类名和小伪代码。

【问题讨论】:

  • 您能否详细说明您的高效标准? List<Shape> 通常足以容纳数千种形状。
  • @trashgod:不应该有闪烁,而且每次切换应用程序时都绘制,不应该要求绘制paintComponent中的所有内容。
  • “不应要求绘制所有内容” 研究“过早优化”。
  • @AndrewThompson:抱歉,我上次(绘制面包板)的经历不是很好。所以我有点担心。
  • “所以我有点担心。”你应该发一点SSCCE。

标签: java swing buffer jpanel graphics2d


【解决方案1】:

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

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

附录:渲染大量对象的一种常见优化使用flyweight pattern。 JTable、JFreeChart 和 JGraph 是示例。这个简化的example 说明了基本机制。

【讨论】:

  • 注意:remove() 应该通过相应的ListIterator 完成。
  • +1 这个很好的例子,虽然我之前忘了发表评论。它可能会帮助我学习绘画的基础知识:-)
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2010-09-20
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多