2010-03-30 12 views
8

Sto creando un editor di testo utilizzando Java swing. Sto usando JTextArea per lo stesso. Voglio sapere come posso usare la funzionalità Annulla e Ripristina in JTextArea poiché non sono in grado di usarlo.Utilizzo di Annulla e Ripristina per JTextArea

risposta

11

Come ho capito, JTextArea non ha alcuna funzionalità di annullamento/ripristino incorporata, ma un Google search ha trovato this article che potrebbe essere utile.

Sembra esistere uno Undo Manager in javax.swing che è possibile collegare agli eventi di modifica di JTextArea.

+1

Ecco un collegamento con un esempio più completo: http://www.java-forums.org/javax-swing/9570-undo-redo-jtextarea.html –

+0

Grazie Peter. Ho risolto il mio problema. – Logan

+0

@Petar Il codice dietro il tuo link non gestisce cosa succede quando tutto il testo è selezionato e sostituito con il contenuto degli appunti. Quello che succede è che l'area di testo viene svuotata invece di essere sostituita con il suo contenuto precedente. Repro: (1) mettere qualcosa negli appunti, (2) selezionare tutti i caratteri nell'area di testo, (3) premere^V per incollare gli appunti sul contenuto selezionato. Non so ancora cosa sta succedendo, ma intendo scoprirlo. Lo stesso vale per il codice dietro il link pubblicato in questa risposta. Ho la sensazione che il problema sia la definizione di "contenuto precedente". – jeff6times7

5

suo stato un po 'che ho fatto questo e io non ricordare i dettagli, ma qui è un legame con alcune informazioni: http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html

Scorrere fino alla sezione intitolata "Ascolto per le modifiche su un documento" per iniziare .

+3

+1, chi è la persona che ha downvoted questo ?? Il tutorial ha un esempio funzionante e spiega cosa sta succedendo, che sicuramente risponde alla domanda. Ora spetta all'OP leggere il tutorial, infatti l'OP dovrebbe aver letto prima il tutorial prima di pubblicare questa domanda. Infatti, se l'utente non era a conoscenza dell'esercitazione di Swing prima di sapere di avere accesso a un riferimento di valore che può essere d'aiuto per le domande future. Questo è il modo in cui tutte le domande dovrebbero essere risolte. – camickr

+0

Grazie per le tue parole gentili :) –

+0

Grazie per le tue osservazioni sarcastiche camickr. Grazie per l'aiuto di Marshall. – Logan

4

Si può fare come questo

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

Una volta che il gestore è allegata al documento del JTextArea, che controllerà tutte le modifiche per il contenuto del testo.

Dopo aver collegato il gestore al componente di testo, è necessario fornire alcuni mezzi per dire al manager di annullare/ripetere un'operazione.

chiamata della funzione Annulla public void() e public void redo() il metodo del UndoManager dove (metodo di un ActionListener Eg. ActionPerformed()) necessari

È possibile allegare Azione oggetti a un pulsante nel modo seguente invece di chiamare undo() e redo() metodi che semplifica il compito:

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

ho dovuto passare attraverso molteplici collegamenti solo per ottenere abbastanza aiuto. Sto aggiungendo qui ciò che ho implementato con successo solo per aiutare i futuri visitatori. Ho implementato questo utilizzando JTextPane ma sto assumendo che lo stesso si applicherebbe per 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) {} 
     } 
    }); 
Problemi correlati