2010-03-30 73 views
8

Estoy haciendo un editor de texto usando Java swing. Estoy usando JTextArea para lo mismo. Quiero saber cómo puedo usar la funcionalidad Deshacer y Rehacer en JTextArea ya que no puedo usarlo.Usando deshacer y rehacer para JTextArea

Respuesta

11

Según tengo entendido, JTextArea no tiene ninguna función inherente de Deshacer/Rehacer integrada, pero un Google search encontró this article que podría ser útil.

Aparentemente existe un Undo Manager en javax.swing que puede conectar a los eventos de cambio de JTextArea.

+1

Aquí hay un enlace con un ejemplo más completo: http://www.java-forums.org/javax-swing/9570-undo-redo-jtextarea.html –

+0

Gracias Peter. Tengo mi problema resuelto. – Logan

+0

@Petar El código detrás de su enlace no controla lo que sucede cuando se selecciona todo el texto y se reemplaza con el contenido del portapapeles. Lo que ocurre es que el área de texto se vacía en lugar de reemplazarse por su contenido anterior. Repro: (1) coloque algo en el portapapeles, (2) seleccione todos los caracteres en el área de texto, (3) presione^V para pegar el portapapeles sobre el contenido seleccionado. Todavía no sé lo que está pasando, pero tengo la intención de averiguarlo. Lo mismo ocurre con el código detrás del enlace publicado en esta respuesta. Tengo la sensación de que el problema es la definición de "contenido anterior". – jeff6times7

5

Su sido un tiempo desde que hice esto y yo no recordar los detalles, pero aquí hay un enlace con algo de información: http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html

Vaya a la sección titulada "Escuchar los cambios en un documento" para empezar .

+3

+1, ¿quién es la persona que rechazó esto? El tutorial tiene un ejemplo de trabajo y explica lo que está sucediendo, que sin duda responde a la pregunta. Ahora le toca al OP leer el tutorial; de hecho, el OP debería haber leído el tutorial primero antes de publicar esta pregunta. De hecho, si el usuario no conocía el tutorial de Swing antes de que lo supieran, tiene acceso a una referencia valiosa que puede ayudarlo en futuras preguntas. Esta es la forma en que todas las preguntas deben ser respondidas. – camickr

+0

Gracias por sus amables palabras :) –

+0

Gracias por sus observaciones sarcásticas camickr. Gracias por ayudar a Marshall. – Logan

4

Puede hacer como esto

UndoManager manager = new UndoManager(); 
textArea.getDocument().addUndoableEditListener(manager); 

Una vez que el administrador se adjunta al documento de la JTextArea, supervisará todos los cambios a los contenidos del área de texto.

Después de adjuntar el administrador al componente de texto, debe proporcionar algunos medios para indicarle al administrador que deshaga/rehaga una operación.

Llame al public void deshacer() y el método de la UndoManager cuando sea necesario (Ej. ActionPerformed() de un ActionListener)

Puede adjuntar Acción se opone a un botón de la siguiente manera public void rehacer() en lugar de llamar deshacer() y rehacer() métodos que simplifica la tarea:

JButton undoButton = new JButton(UndoManagerHelper.getUndoAction(manager)); 
JButton redoButton = new JButton(UndoManagerHelper.getRedoAction(manager)); 
1

que tenía que pasar por múltiples enlaces sólo para obtener la ayuda necesaria. Estoy agregando aquí lo que implementé con éxito solo para ayudar a los futuros visitantes. Implementé esto usando JTextPane pero supongo que lo mismo se aplicaría a la JTextArea

JTextArea textArea = new JTextArea(); 
    JButton undo = new JButton("Undo"); 
    JButton redo = new JButton("Redo"); 
    KeyStroke undoKeyStroke = KeyStroke.getKeyStroke(
      KeyEvent.VK_Z, Event.CTRL_MASK); 
    KeyStroke redoKeyStroke = KeyStroke.getKeyStroke(
      KeyEvent.VK_Y, Event.CTRL_MASK); 

    UndoManager undoManager = new UndoManager(); 

    Document document = textArea.getDocument(); 
    document.addUndoableEditListener(new UndoableEditListener() { 
     @Override 
     public void undoableEditHappened(UndoableEditEvent e) { 
      undoManager.addEdit(e.getEdit()); 
     } 
    }); 

    // Add ActionListeners 
    undo.addActionListener((ActionEvent e) -> { 
     try { 
      undoManager.undo(); 
     } catch (CannotUndoException cue) {} 
    }); 
    redo.addActionListener((ActionEvent e) -> { 
     try { 
      undoManager.redo(); 
     } catch (CannotRedoException cre) {} 
    }); 

    // Map undo action 
    textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
      .put(undoKeyStroke, "undoKeyStroke"); 
    textArea.getActionMap().put("undoKeyStroke", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       undoManager.undo(); 
      } catch (CannotUndoException cue) {} 
     } 
    }); 
    // Map redo action 
    textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
      .put(redoKeyStroke, "redoKeyStroke"); 
    textArea.getActionMap().put("redoKeyStroke", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       undoManager.redo(); 
      } catch (CannotRedoException cre) {} 
     } 
    }); 
Cuestiones relacionadas