mytextarea.java

来自「一个有undo」· Java 代码 · 共 141 行

JAVA
141
字号
package com.thb.mytool;

/**
 * <p>Title: DBMS</p>
 * <p>Description: This is a database manager system</p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: UPC</p>
 * @author THB
 * @version 1.0
 */

import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.*;
import javax.swing.undo.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;

public class MyTextArea extends JTextArea
        implements ClipboardOwner {

  private UndoableEdit edit;
  private Document document;
  private Clipboard clipBoard;
  private UndoManager undoManager;

  /**
   * 当用户在Text Area中有所操作时,就可以用getEdit()方法取得UndoableEdit对象,
   * 此对象纪录着刚刚用户的操作,因此可由些对象的undo()或redo()达到取消或复原的功能.
   */
  public MyTextArea() {

    document = getDocument();
    undoManager = new UndoManager();
    clipBoard = this.getToolkit().getSystemClipboard();

    document.addUndoableEditListener(new UndoableEditListener() {
      public void undoableEditHappened(UndoableEditEvent e) {
        edit = e.getEdit();
        undoManager.addEdit(edit);
      }
    });
  }

  public void addActionMap() {

    getActionMap().put("Undo", new AbstractAction("Undo") {
      public void actionPerformed(ActionEvent evt) {
        try {
          if (undoManager.canUndo()) {
            undoManager.undo();
          }
        }
        catch (CannotUndoException e) {
        }
      }
    });
    getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo");

    getActionMap().put("Redo", new AbstractAction("Redo") {
      public void actionPerformed(ActionEvent evt) {
        try {
          if (undoManager.canRedo()) {
             undoManager.redo();
          }
        }
        catch (CannotRedoException e) {
        }
      }
    });
    getInputMap().put(KeyStroke.getKeyStroke("control R"), "Redo");

    getActionMap().put("Copy", new AbstractAction("Copy") {
      public void actionPerformed(ActionEvent evt) {
        copy();
      }
    });
    getInputMap().put(KeyStroke.getKeyStroke("control C"), "Copy");

    getActionMap().put("Cut", new AbstractAction("Cut") {
      public void actionPerformed(ActionEvent evt) {
        cut();
      }
    });
    getInputMap().put(KeyStroke.getKeyStroke("control X"), "Cut");

    getActionMap().put("Paste", new AbstractAction("Paste") {
      public void actionPerformed(ActionEvent evt) {
        paste();
      }
    });
    getInputMap().put(KeyStroke.getKeyStroke("control V"), "Paste");
  }

  public void copy() {

    String copy = getSelectedText();

    if (copy != null) {
      StringSelection str = new StringSelection(copy);
      clipBoard.setContents(str, this);
    }
  }

  public void cut() {

    String copy = getSelectedText();

    if (copy != null) {
      StringSelection str = new StringSelection(copy);
      clipBoard.setContents(str, this);
      replaceSelection("");
    }
  }

  public void paste() {

    Transferable transfer = clipBoard.getContents(this);

    if (transfer != null) {
      try {
        String str = (String)transfer.getTransferData(DataFlavor.stringFlavor);
        this.replaceRange(str, getSelectionStart(), getSelectionEnd());
      }
      catch(UnsupportedFlavorException e) {
      }
      catch(IOException e) {
      }
    }
  }

  public void lostOwnership(Clipboard clipboard, Transferable contents) {
  }

  public UndoableEdit getEdit() {
    return edit;
  }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?