2010-03-30 111 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) {} 
     } 
    });