swing undo 操作的实现

课程quiz里要求设计一个点餐的界面。需要一个按钮clear,实现撤销的功能。(比如说顾客不想要了,或者服务生错误输入需要撤回)

大致效果是这样

swing undo 操作的实现

点击一次clear后,

swing undo 操作的实现

具体的操作就是将JTextArea中的最后一行去掉。clear当然可以点击多次,所有很有些栈结构的味道。orderNow按钮则会清空整个Area(顾客已点完,setText("")即可实现).

undo操作的实现方式有这么几种

1. ArrayList 。ArrayList是栈结构在java中的呈现方式之一,可以在点餐的时候记录下每一个item,需要撤销时就撤销掉最后一个。这里Area中要利用substring来截取remaining的string,弃掉每次的最后一行。

2.寻找换行符。每行字符串末尾都有换行符,找到倒数第二个换行符的位置,确定index,再使用substring

3.我觉得最好能实现通用的Jframe undo操作。查询了一些博客和贴吧,讲得有些乱。于是直接查了java doc

swing undo 操作的实现

可谓很清晰了。先在声明区声明一个全局的UndoManager

然后可以在构造函数里加入最后一句。这样UndoManager就能manage TextArea中的相关操作。当然,这些操作必须是undoable的。

最后在相应的事件响应函数里使用undoManager.undo()即可 ----即撤销了在TextArea中发生的最近一步操作

PS: redo大致类似

         不同的操作区域(比如重新声明了一个TextField)需要不同的UndoManager实例来管理