2010-03-30 4 views
8

Java 스윙을 사용하여 텍스트 편집기를 만들고 있습니다. 같은 JTextArea 사용하고 있습니다. JTextArea에서 실행 취소 및 다시 실행 기능을 사용할 수있는 방법을 알고 싶습니다. 아래 섹션에 http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.htmlJTextArea에 대해 실행 취소 및 다시 실행 사용

스크롤 "문서에 변경 내용을 듣기는"시작하기 : 내가 이런 짓을 나는 세부 사항을 기억 해달라고하지만, 여기에 몇 가지 정보와 링크이기 때문에 그것의 잠시가되어

답변

11

JTextArea는 원래 실행 취소/다시 실행 기능이 내장되어 있지 않지만 Google search은 도움이 될 수있는 this article을 찾았습니다.

javax.swing에는 Undo Manager이 있으며, JTextArea의 변경 이벤트에 연결할 수 있습니다. 관리자가 JTextArea에의 문서에 첨부되면

+1

다음은 좀 더 완벽한 예입니다. http://www.java-forums.org/javax-swing/9570-undo-redo-jtextarea.html –

+0

Thanks Peter. 내 문제가 해결 됐어. – Logan

+0

@ 페타 링크 뒤에있는 코드는 모든 텍스트를 선택하고 클립 보드의 내용으로 바꿀 때 일어나는 일을 처리하지 않습니다. 텍스트 영역이 이전 내용으로 대체되는 대신 비 웁니다. Repro : (1) 클립 보드에 무엇인가 넣기, (2) 텍스트 영역의 모든 문자를 선택, (3)^V를 눌러 클립 보드를 선택한 내용 위에 붙여 넣습니다. 나는 아직 어떤 일이 일어나고 있는지 모르지만 알아 내고자한다. 이 답변에 게시 된 링크 뒤의 코드도 마찬가지입니다. 나는 문제가 "이전 내용"의 정의라는 느낌을 가지고 있습니다. – jeff6times7

5

.

+3

+1 누가 이것을 downvoted 했습니까? 이 튜토리얼은 작동 예제를 가지고 있으며 무엇이 진행되고 있는지를 설명합니다. 가장 확실하게 질문에 답합니다. 이제 OP에서 자습서를 읽는 것입니다. 사실 OP는이 질문을 게시하기 전에 먼저 자습서를 읽어야합니다. 사실, 사용자가 Swing 튜토리얼을 알기 전에 사용자가 향후 질문에 도움이되는 중요한 참조에 액세스 할 수 있다는 것을 알지 못하는 경우 이것은 모든 질문에 답해야하는 방법입니다. – camickr

+0

당신의 친절한 단어를 주셔서 감사합니다 :) –

+0

감사합니다 비꼬 냐 발언 camickr. 마샬을 도와 주셔서 감사합니다. – Logan

4

당신이

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

같이 할 수있는, 모든 텍스트 영역의 내용 변경 모니터링합니다.

관리자를 텍스트 구성 요소에 연결 한 후에는 관리자에게 작업을 실행 취소/다시 실행하기 위해 관리자에게 을 알리는 수단을 제공해야합니다.

를 호출 공공 무효 실행 취소() 및 공공 무효의 리두() 조치를 첨부 할 수 있습니다

필요한 (하는 ActionListener의 예.의 actionPerformed() 메소드는) 다음과 같은 방법으로 버튼에있는 오브젝트를 UndoManager 방법

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

난 그냥 충분한 도움을 얻으려면 여러 링크를 통해 이동해야했다 undo() 및 redo() 메서드를 호출하는 대신. 미래의 방문자를 돕기 위해 내가 성공적으로 구현 한 것을 여기서 추가하고 있습니다. 나는 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) {} 
     } 
    }); 
관련 문제