我正在使用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. 使用链接列表撤销/重做
- 2. 使用MemberwiseClone实现撤销/重做
- 3. ICSharpCode.TextEditor撤销/重做状态
- 4. 撤销/重做+保存
- 5. 在WPF中撤销/重做?
- 6. 申请撤销重做上
- 7. 撤销/重做在JavaScript
- 8. C#撤销/重做树木和线程
- 9. 重置撤销/重做阵列iOS
- 10. 在TextArea中实现撤销/重做
- 11. 在jquery中撤销/重做插件
- 12. 在MVC中实现撤销/重做
- 13. 在Eclipse E4中撤销重做
- 14. InkCanvas的撤销/重做命令堆栈
- 15. JTextPane撤销并重做整个单词
- 16. 撤销/重做纪念图案c#
- 17. React Native编程撤销/重做
- 18. 草案JS Modifier.ReplaceText撤销/重做错误
- 19. 撤销重做与实体框架
- 20. 使用Eclipse数据绑定和不使用EMF的撤销/重做
- 21. 使用Memento撤销/重做:堆栈,队列还是只是LinkedList?
- 22. 是否可以使用JavascriptMVC实现撤销/重做引擎?
- 23. 使用jQuery修改textarea上的撤销/重做行为
- 24. 是否可以使用C#在Excel中执行撤销/重做?
- 25. MVVM光和撤消/重做?
- 26. 支持多添加/删除(和撤销/重做)与化QAbstractItemModel(C++)
- 27. 如何撤销和重做iPhone中的流畅线条?
- 28. 在控制器/视图中执行撤销和重做
- 29. 木偶和mysql:撤销和重复
- 30. 在可可应用程序中禁用撤销/重做
下面是一个更完整的例子的链接: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