Tag: undo redo

绘图应用程序中撤消/重做的命令模式

我想在一个小的绘图应用程序中实现undo / redo。 似乎命令模式非常适合使用,但我不确定如何最好地实现它。 据我了解模式,有必要在每个命令中包含: 用于重做的绘制操作的详细信息(例如,线 – >开始和结束点,自由格式线 – > GeneralPath ) 更改撤消之前组件的状态。 在这种情况下,这将是受命令影响的区域的小快照图像。 我的理解是,每个命令都需要“primefaces”或自包含,并具有撤消/重做该操作所需的所有信息。 不幸的是,这需要存储比我最初预期更多的信息。 对于一行,我们还必须考虑最初用于绘制它的Color , Stroke和RenderingHints类的东西。 这将我的“简单的小命令”变成了一些东西……在内存中更笨重,并且有更多的样板代码可以生成(每个都是可序列化的bean 1 )。 出于记忆保护的原因(大多数情况下),我想要“欺骗”命令的规范。 也许每100次更新都会备份整个绘图区域,但是不存储已更改图像的任何部分,只需为每次新的绘制操作重建最后(最多)100个命令。 但是在绘制每个零件之前确保Graphics对象的状态是正确的似乎是有问题的 – 这部分可能需要一条线,但RenderingHints在4个命令之前被更改, Color在98命令之前被更改,而Stroke仍然是最后227个命令也一样。 追求更高效的内存命令似乎将模式从“primefaces”方面抛到了窗外。 这反过来导致难以确定可能影响渲染的最早命令。 我是不是该: 寻找新的模式? 尝试通过调整模式来实现我的特殊需求? 将所有这些丢弃在垃圾箱中作为过早优化,并以最简单(并且最耗费内存消耗)的方式对其进行编码,以便遵循定义的命令模式? 更新 “每个都是一个可序列化的豆子”在第二个想法,没有。 我做了圆顶检查,发现Graphics2D (整齐地封装了绘制时使用的许多参数)不可序列化。 此外, BasicStroke 是可序列化的,但不存储笔划的粗细。 我可以创建许多属性的可序列化版本,但它似乎会产生更多的代码,所以我将放弃该规范。 同样。 我将只尝试在运行时存储对BufferedImage的引用。

扩展Swing的UndoManager以提供重复和多次撤消/重做

我的任务是为应用程序添加撤消/重做/重复function。 我正在调查是否可以使用Swing的UndoManager。 除了通常的撤消和重做按钮之外,我还需要提供一次撤消或重做多个编辑的function(像MS Office一样下拉UI),并重复选择的编辑。 我相信我可以使用UndoManager进行多次撤消和重做。 它提供了多个撤消和重做的方法。 为了构建UI,我可以扩展UndoManager以显示它所拥有的编辑。 我不确定我是否可以使用UndoManager重复选择操作。 我的第一个想法是扩展UndoManager并添加重复(编辑)方法。 此方法将克隆或复制编辑,重做副本,然后将副本放在撤消堆栈的顶部。 如果编辑实现了Clonable,则编辑只能重复。 这看起来合情合理吗? 有更好的解决方案吗? 我应该自己滚动而不是UndoManager吗? 提前致谢。

JTextArea setText()和UndoManager

我正在使用UndoManager捕获我的JTextArea更改。 然而,方法setText()会删除所有内容,然后粘贴文本。 当我撤消时,我首先看到一个空白区域然后它将显示它之前有哪些文本。 如何重现: 运行以下代码 单击setText()按钮 按CTRL + Z撤消(你会看到一个空的textarea!) 按CTRL + Z撤消(您将看到实际的先前文本) 我想跳过3)。 import javax.swing.AbstractAction; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.text.Document; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; import java.awt.event.ActionEvent; import javax.swing.JButton; import java.awt.event.ActionListener; @SuppressWarnings(“serial”) public class JTextComponentSetTextUndoEvent extends JFrame { JTextArea area = new JTextArea(); public JTextComponentSetTextUndoEvent() { setSize(300, […]