服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用java来实现编辑器的undo redo功能

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

扫描关注微信公众号