JTextField com Ctrl z e Ctrl y - Desfazer e Refazer - Undo e Redo

Crie uma classe que herde do JTextField


package view.components.txtcps;

import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;

public class TxtComUndoRedo extends JTextField {

    private UndoAction undoAction = new UndoAction();
    private RedoAction redoAction = new RedoAction();
    private UndoManager undo = new UndoManager();

    public TxtComUndoRedo() {
        this.getDocument().addUndoableEditListener(new MyUndoableEditListener());
        
        configurarMapa(this);
    }

    private void configurarMapa(JTextField txtField) {
        InputMap inputMap = txtField.getInputMap();

        // Ctrl-z desfaz
        KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK);
        inputMap.put(key, undoAction);

        // Ctrl-y refaz
        key = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK);
        inputMap.put(key, redoAction);

    }
    
    private class MyUndoableEditListener implements UndoableEditListener {

        @Override
        public void undoableEditHappened(UndoableEditEvent e) {
            //Remember the edit and update the menus
            undo.addEdit(e.getEdit());
            undoAction.updateUndoState();
            redoAction.updateRedoState();
        }

    }

    private class UndoAction extends AbstractAction {

        private UndoAction() {
            setEnabled(false);
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                undo.undo();
            } catch (CannotUndoException ex) {
            }
            updateUndoState();
            redoAction.updateRedoState();

        }

        /* Controla Status do btnUndo */
        private void updateUndoState() {
            if (undo.canUndo()) {
                setEnabled(true);
            } else {
            }
        }

    }

    private class RedoAction extends AbstractAction {

        private RedoAction() {
            setEnabled(false);
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                undo.redo();
            } catch (CannotRedoException ex) {
            }
            updateRedoState();
            undoAction.updateUndoState();

        }

        /*Controla Status do btnRedo*/
        private void updateRedoState() {
            if (undo.canRedo()) {
                setEnabled(true);
                //   putValue(Action.NAME, undo.getRedoPresentationName());
            } else {
                setEnabled(false);
                // putValue(Action.NAME, "Redo");
            }
        }

    }

}

Crie um txt qualquer herdando da classe anterior exemplo:

public class TxtBusca extends TxtComUndoRedo { .... }

Funcionando 100%