· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

使用Java来实现编辑器的Undo Redo功能

发布时间:2007.08.08 06:06     来源:赛迪网    作者:dxaw

用java实现编辑器的Undo Redo功能,非常的方便,下面是一个实现这个功能的类,

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功能,而且是次数不收限制的。

(责任编辑:龚勋)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· Java新手学堂:Acegi框架技术详细介绍 (08-07) · 简单介绍 AspectJ 类的名称模式 (08-06)
· Java使用技巧:访问在接口中定义的常量 (08-06) · BeanShell 在人工测试与管理之中的应用 (08-06)
· 让系统更听话 Windows XP 管理技巧总结 (08-06) · JSP获取客户端的浏览器和操作系统信息 (08-03)
· Java同步机制:sychronized对代码影响 (08-03) · 基础应用:Java Web中三层架构配置入门 (08-03)
· 新手入门:Java XML编程实例解析 (08-03) · JS实现无刷新联动菜单(select)的方法 (08-03)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..