Monthly Archives: December 2007

应该不应该与知道不知道 转载

去找firefox的chmreader插件,发现作者是个中国人,他的博客是无知的我,在他的自我介绍 中引用了这篇文章。     从我们一来到这个世界咿呀学语开始,总有一个喋喋不休的声音伴随我们走过生命的全部过程:”你应该这样,不应该那样。”父母长辈、老师领导、教科书媒体文件,都是这类声音的制造者和传承者。     人们心安理得地接受教训和告诫,很少或者根本不去追问我们为什么应该这样不应该那样。怎么不是应该那样不应该这样? 教训告诫人者均以知道者博学者智慧者权威者领导者自居,视被教被告者为下者弱者愚者或者盲者贱者。     实际情形如何?     首先,教训人者的基本思维方式便是可疑的。几千年前的古人都知道,人之患莫大于好为人师。此”患”患什么呢?患在为人师者的盲目自信,盲目自以为是,以为自己知道,以为自己可以取代别人,其实谁能用自己的生命历程、感悟和收获去取代别人的生命历程、感悟和收获呢?难道不是每个人都是一个完整独立的世界吗?美国人约翰巴洛所发表的互联网独立宣言称:我们创造一个世界,这个世界可以让任何人在任何地方表达他们的信念,无论这个信念多么独特,他们都无需害怕自己要被迫沉默或者服从。如此大度和包容万象的世界不是很好吗?     教训人、告诫人者都以为自己对所教训、告诫别人的东西什么都知道。在信息时代、在知识时时更新的互联网时代,尽管许多人比如某些知识分子们少了许多自信,不再认为自己有知有识,但仍然只谦虚地把自己归于知道一列,自称为知道分子,以知道分子的身份教训、告诫人。     知道分子们到底知道多少?什么时候才知道?林语堂有一段妙论:人幼时认为什么都不知道,上大学时以为什么都知道,大学毕业时才知道什么都不知道,待到中年时又认为什么都知道,直到晚年才觉悟到自己什么都不知道。     林氏是说,人从不懂事不知道来到人世,走过一圈重归尘土时依然一无所知,就像赤裸裸地来仍赤裸裸地去一样。     教训、告诫人者也常常把教育的功能无限夸大,以为在改造人充实人方面教育万能,近年来已经有越来越多的人把教育功能大打折扣了,有人很直接地表述道:什么是教育,教育就是把所学的东西忘记后剩下的东西,就是铭刻在骨子里的素质和精神。这种素质和精神不可能由知道分子简单地教训、告诫给人,更不可能由某些已经堕落为纯商业行为的学校教训、告诫给人。     苏格拉底说:我只知道一件事,那就是我什么都不知道。那么,还有多少人比苏格拉底更聪明而知道两件事呢?

Java中实现Undo和Redo操作

可撤销操作: 每一个可以撤销的操作都是一个UndoableEdit对象(实质是实现了UndoableEdit接口),对于自定义的可撤消操作,可以直接实现UndoableEdit接口,也可以继承AbstractUndoableEdit对象。AbstractUndoableEdit已经帮助我们进行了基本的底层实现。 自定义UndoableEdit对象的一般的实现为: 构造函数:接收执行操作必要的参数(也许还要保存初始状态,当然,放在execute()里面似乎更合理一些) execute() :执行操作,保存初始状态以便执行undo操作。这个函数不是UndoableEdit接口的一部分,但因为redo一般就是execute(),所以一起放在UndoableEdit对象里面。 undo():撤销操作,根据保存的初始状态进行还原。 redo():重做操作,调用execute。 注意,如果是继承于AbstractUndoableEdit,在undo(),redo()中要各自先调用一下super.undo()和super.redo(),这两个函数会更新底层的boolean值,用于标记AbstractUndoableEdit的执行状态,在UndoManager中会用到。 getPresentationName():对于操作的描述。 然后,UndoManager。 对于可撤销操作的执行和管理需要用到UndoManager,它负责undo/redo的执行,更新内部队列。 每执行一次UndoableEdit操作,undoManager.addEdit(edit)将它加入到undoManager维护的一个操作队列中。 要撤销或重做某次操作只需要undoManager.undo()或者undoManager.redo()就行了。 由于每执行一次UndoableEdit操作,需要更新undo、redo按钮或菜单。那么就用一个UndoableEditSupport 来进行管理。 基本的流程是: 每次产生一个UndoableEdit对象,执行对象操作。 调用UndoableEditSupport.postEdit(edit)将它传递给UndoableEditSupport对象。 这会触发添加在UndoableEditSupport对象里面的UndoableEditListener。 然后在这个自定义的UndoableEditListener的undoableEditHappened函数中,获取UndoableEdit对象并将这个对象传递给UndoManager,再刷新 undo,redo 按钮或菜单。 undo/redo的按钮或菜单中需要处理的操作就是undoManager.undo()或者undoManager.redo()然后更新按钮或菜单信息就行了。