· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

使用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技术 信息化
专题:谷歌发布PC操作系统Chrome OS
·芯能量 新动力 兴经济:..
·专题:英特尔与AMD和解 ..
·专题:惠普27亿收购3Com..
专题:
·专题:诺基亚危局已现 ..
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
 
·惠普123459黑白激打家族..
·云计算格局初现 三大阵..
·分析:虚拟化在高性能计..
2009 IBM动态架构新动力论坛
·直播:第八届中国系统与..
·专题:置身智慧海洋——..
·专题:让物品开口说话 ..