2010-03-30 75 views
8

我正在使用Java swing進行文本編輯。我正在使用JTextArea。我想知道如何在JTextArea中使用撤消和重做功能,因爲我無法使用它。使用撤銷和重做JTextArea

回答

11

據我所知,JTextArea沒有內置的固有撤銷/重做功能,但Google search的確發現this article這可能會有所幫助。

javax.swing中顯然存在Undo Manager,您可以連接到JTextArea的更改事件。

+1

下面是一個更完整的例子的鏈接:http://www.java-forums.org/javax-swing/9570-undo-redo-jtextarea.html – 2010-03-30 18:05:32

+0

謝謝彼得。我解決了我的問題。 – Logan 2010-04-03 11:34:48

+0

@Petar鏈接後面的代碼無法處理選中所有文本並將其替換爲剪貼板內容時發生的情況。會發生什麼情況是文本區域被清空,而不是被其以前的內容替換。 Repro:(1)在剪貼板中放入內容,(2)選擇文本區域中的所有字符,(3)按^ V將剪貼板粘貼到所選內容上。我不知道發生了什麼,但我打算髮現。這個答案中發佈的鏈接背後的代碼也是如此。我有一種感覺,問題是「以前的內容」的定義。 – jeff6times7 2017-10-04 18:50:48

5

它已經一段時間,因爲我這樣做,我不記得細節,但這裏是有一些信息的鏈接:http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html

向下滾動到標題爲「監聽對文檔的更改」上手。

+3

+1,誰是downvoted這個??本教程有一個工作示例並解釋發生了什麼,這肯定會回答這個問題。現在由OP來閱讀教程,實際上OP應該在發佈這個問題之前先閱讀教程。事實上,如果用戶不知道Swing教程,他們知道可以訪問有助於解決未來問題的寶貴參考資料。這是所有問題都應該回答的方式。 – camickr 2010-03-30 21:33:21

+0

感謝您的客氣話:) – 2010-03-30 22:01:17

+0

感謝您的諷刺評論camickr。 感謝幫助馬歇爾。 – Logan 2010-04-03 11:35:44

4

你可以這樣做

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

一旦管理器連接到JTextArea中的文件,它會監視所有的變化 到文本區的內容。

將管理器附加到文本組件後,您必須提供一些方法告知 管理器撤銷/重做操作。

調用公共無效撤消()和公共無效重做()在必要時(ActionListener的EG。actionPerformed()方法)

您可以將Action對象的按鈕在下列方式的UndoManager的方法而不是調用簡化任務的undo()和redo()方法:

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

我必須通過多個鏈接才能獲得足夠的幫助。我在這裏添加我成功實施的內容,只是爲了幫助未來的訪問者。我使用JTextPane實現了這一點,但我假設同樣適用於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) {} 
     } 
    });