我正在使用Java swing進行文本編輯。我正在使用JTextArea。我想知道如何在JTextArea中使用撤消和重做功能,因爲我無法使用它。使用撤銷和重做JTextArea
8
A
回答
11
據我所知,JTextArea沒有內置的固有撤銷/重做功能,但Google search的確發現this article這可能會有所幫助。
在javax.swing
中顯然存在Undo Manager,您可以連接到JTextArea的更改事件。
5
它已經一段時間,因爲我這樣做,我不記得細節,但這裏是有一些信息的鏈接:http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html
向下滾動到標題爲「監聽對文檔的更改」上手。
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) {}
}
});
相關問題
- 1. QLineEdit撤銷/重做功能干擾全局撤銷/重做
- 2. 使用MemberwiseClone實現撤銷/重做
- 3. 使用鏈接列表撤銷/重做
- 4. 申請撤銷重做上
- 5. 在WPF中撤銷/重做?
- 6. 實現撤銷/重做
- 7. 撤銷/重做+保存
- 8. 撤銷/重做在JavaScript
- 9. ICSharpCode.TextEditor撤銷/重做狀態
- 10. C#撤銷/重做樹木和線程
- 11. 畫布上的撤銷和重做
- 12. tinyMCE禁用撤銷/重做功能
- 13. 撤銷/重做用於iOS的
- 14. 重置撤銷/重做陣列iOS
- 15. 收聽撤銷/重做事件contenteditable div
- 16. 撤銷重做與實體框架
- 17. 檢查有撤銷/重做主幹undo
- 18. 撤銷/重做紀念圖案c#
- 19. Fabric.js中的撤銷 - 重做功能
- 20. 實現撤銷/重做標籤JEditorPanes
- 21. 在MVC中實現撤銷/重做
- 22. 在Eclipse E4中撤銷重做
- 23. InkCanvas的撤銷/重做命令堆棧
- 24. JTextPane撤銷並重做整個單詞
- 25. 在TextArea中實現撤銷/重做
- 26. 在jquery中撤銷/重做插件
- 27. 草案JS Modifier.ReplaceText撤銷/重做錯誤
- 28. React Native編程撤銷/重做
- 29. 在flex中執行撤銷重做
- 30. Ckedior:重做和撤銷插件沒有重置它的堆棧
下面是一個更完整的例子的鏈接:http://www.java-forums.org/javax-swing/9570-undo-redo-jtextarea.html – 2010-03-30 18:05:32
謝謝彼得。我解決了我的問題。 – Logan 2010-04-03 11:34:48
@Petar鏈接後面的代碼無法處理選中所有文本並將其替換爲剪貼板內容時發生的情況。會發生什麼情況是文本區域被清空,而不是被其以前的內容替換。 Repro:(1)在剪貼板中放入內容,(2)選擇文本區域中的所有字符,(3)按^ V將剪貼板粘貼到所選內容上。我不知道發生了什麼,但我打算髮現。這個答案中發佈的鏈接背後的代碼也是如此。我有一種感覺,問題是「以前的內容」的定義。 – jeff6times7 2017-10-04 18:50:48