用java实现编辑器的撤消、重做功能

用java实现编辑器的撤消、重做功能,非常的方便,下面是一个实现这个功能的类,

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JEditorPane;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.JTextComponent;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
/**
* UndoWrapper is responsible for adding undo and redo support to text components.
* @author Antonio Vieiro (antonio@antonioshome.net), $Author: $
* @version $Revision: $
*/
public class UndoWrapper
  implements UndoableEditListener
{
  private UndoManager undoManager;
  private UndoAction undoAction;
  private RedoAction redoAction;
  private JEditorPane textComponent;

  /**
  * Creates a new instance of UndoWrapper
  */
  public UndoWrapper( JEditorPane aComponent )
  {
   textComponent = aComponent;
   undoManager = new UndoManager();
   undoAction = new UndoAction();
   redoAction = new RedoAction();
   textComponent.getDocument().addUndoableEditListener( this );
   textComponent.getInputMap().put( (KeyStroke) undoAction.getValue(
Action.ACCELERATOR_KEY), "undo" );
   textComponent.getInputMap().put( (KeyStroke) redoAction.getValue(
Action.ACCELERATOR_KEY), "redo" );
   textComponent.getActionMap().put( "undo", undoAction );
   textComponent.getActionMap().put( "redo", redoAction );
  }

  public void undoableEditHappened(UndoableEditEvent e)
  {
   undoManager.addEdit( e.getEdit() );
   undoAction.updateUndoState();
   redoAction.updateRedoState();
  }

  /**
  * UndoAction is the Action responsible for handling the undo operation.
  */
  class UndoAction
   extends AbstractAction
  {
   public UndoAction()
   {
    super( "Cannot undo" ); // TODO: I18N
    setEnabled( false );
    putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Z") );
   }

   public void actionPerformed(ActionEvent e)
   {
    try
    {
     undoManager.undo();
    }
    catch( CannotUndoException cue )
    {
     // TODO: Use logging?
     cue.printStackTrace( System.err );
    }
    updateUndoState();
    redoAction.updateRedoState();
   }

   void updateUndoState()
   {
    if ( undoManager.canUndo() )
    {
     setEnabled( true );
     putValue( Action.NAME, "Undo" ); // TODO I18N
    }
    else
    {
     setEnabled( false );
     putValue( Action.NAME, "Cannot undo" ); // TODO I18N
    }
   }
  }

  /**
  * RedoAction is the Action responsible for handling the redo operation.
  */
  class RedoAction
   extends AbstractAction
  {
   public RedoAction()
   {
    super( "Cannot redo" ); // TODO I18N
    setEnabled( false );
    putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Y") );
   }
   public void actionPerformed(ActionEvent e)
   {
    try
    {
     undoManager.redo();
    }
    catch( CannotRedoException cre )
    {
     // TODO: Use logging?
     cre.printStackTrace( System.err );
    }
    updateRedoState();
    undoAction.updateUndoState();
   }

   void updateRedoState()
   {
    if ( undoManager.canRedo() )
    {
     setEnabled( true );
     putValue( Action.NAME, "Redo" ); // TODO I18N
    }
    else
    {
     setEnabled( false );
     putValue( Action.NAME, "Cannot redo" ); // TODO I18N
    }
   }
  }

  UndoAction getUndoAction()
  {
   return undoAction;
  }

  RedoAction getRedoAction()
  {
   return redoAction;
  }
}

使用的时候,只需要将你创建的JEditorPane作为对象传入UndoWrapper中即可。使用方式如下new UndoWrapper(editorPane);

OK这样你的编辑器就具有了Undo Redo功能,而且是次数不收限制的。

时间: 2024-11-02 22:53:17

用java实现编辑器的撤消、重做功能的相关文章

删除- 编辑器中快捷键的功能实现

问题描述 编辑器中快捷键的功能实现 某些软件中需要利用某些组合按键或特定按键实现快捷功能,如Ctrl+Q 可以 退出,Ctrl+S 实现保存.Linux 中可以利用signal( )来捕捉某些特定信号, 并触发相应处理函数. 请编写一个编辑器软件可以实现如下功能,并将其功能用快捷键方式实现. (1) 基本编辑功能:增加.修改.删除.复制.粘贴.撤消: (2) 存盘功能:新建.保存.另存为.退出.不存盘退出: (3) 上述功能可定义相应快捷键,并实现快捷功能. 解决方案 这个很简单,你新建一个MF

Java IDE 编辑器 --- IntelliJ IDEA 进阶篇 生成 hibernate 实体与映射文件

原文:转:Java IDE 编辑器 --- IntelliJ IDEA 进阶篇 生成 hibernate 实体与映射文件 2011-04-30 12:50         很多人不知道怎么用 IntelliJ IDEA 编辑器生成 Hibernate 实体映射文件,很多人认为 IDEA 不支持此功能,或者需要安装特定的插件才能完成该操作.实际上 IDEA 支持该功能也无需安装IntelliJ IDEA插件.          以下为 IntelliJ IDEA 编辑器生成 Hibernate 实

Java 8无人谈及的八大功能

时间戳锁 一直以来,多线程代码是服务器开发人员的毒药(问问Oracle的Java语言架构师和并行开发大师Brian Goetz).Java的核心库不断加入各种复杂的用法来减少访问共享资源时的线程等待时间.其中之一就是经典的读写锁(ReadWriteLock),它让你把代码分成两部分:需要互斥的写操作和不需要互斥的读操作. 表面上看起来很不错.问题是读写锁有可能是极慢的(最多10倍),这已经和它的初衷相悖了.Java 8引入了一种新的读写锁--叫做时间戳锁.好消息是这个家伙真的非常快.坏消息是它使

易企微微信编辑器新版有哪些功能?

  易企微微信编辑器新版有哪些功能?         1.增加文章保存功能.图文再次编辑更方便. 易企微微信编辑器 2.增加全网爆文功能.全网最新10W+热文及时收录,让您时时了解热点动态. 易企微微信编辑器 3.增加原创精选功能.全部是原创优质文章素材,可以直接使用,节省大量找素材时间. 易企微微信编辑器 4.增加微信文章一键采集功能.喜欢的微信文章一键采集,超级方便.

微信-我用java做了几个小功能,想放到公众号上可以访问,现在不知道怎么办了,请帮助,能留下QQ最好

问题描述 我用java做了几个小功能,想放到公众号上可以访问,现在不知道怎么办了,请帮助,能留下QQ最好 用jsp做的几个小功能,想要在微信订阅号上可以访问,求帮助,能留下QQ最好,谢谢了 解决方案 申请公众号 我同学是用jfinal开发的

图片-用Java怎么实现查找价格区间功能?

问题描述 用Java怎么实现查找价格区间功能? 定义的gPrice是String类型,可以改动,怎么才能做出价格区间的查找呢? 解决方案 你输入的内容最后转换成了String,应该直接转成double类型, double price=sc.nextDouble. for(int i = 0 ; i <list.size() ; i++){ Goods g = list.get(i); //把g.gPrice转换成double类型 double gPrice = Double.valueOf(g.

c# 客户端 调用 java Webservice 实现图片上传功能

问题描述 c# 客户端 调用 java Webservice 实现图片上传功能 no SOAPAction header c#端添加服务引用 生成实体类 直接调用webservice图片上传方法 结果报错**no SOAPAction header** 解决方案 有没有大神 来帮帮忙 解决方案二: 参考这个:http://blog.csdn.net/wxyong3/article/details/38727503

java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源

问题描述 java怎么实现类似HTTPWatch的功能,打开url地址后请求的资源 目前很多浏览器都有这样的功能,在地址栏中输入连接后中可以通过httpwatch,清楚的看到此连接已经请求了多少资源(图片,css,js)等等.想问问高手,如何利用java实现,或者说java有没有这种开源的工具. 想实现的功能如图,我在地址栏中输入www.hao123.com后,可以看到它向服务器进行了很多资源的请求.我想知道的如何通过java来获取这些请求资源.

java 网站上做语音直播功能,用到哪些技术?

问题描述 java 网站上做语音直播功能,用到哪些技术? 用java开发的网站上想做语音直播功能,用到哪些技术?求大神支招,小弟谢谢啦 解决方案 流媒体服务器+客户端播放器,都有现成的软件