2013-03-06 10 views
1
와 함께 작동하도록 UndoableEdit에 추가

편집 : 게시물의 끝에서보기 ...UndoManager를 수동으로이 JTabbedPane에

시작하기를 바랍니다 ... 내 나쁜 영어에 대한 실례하시기 바랍니다

JTabbedPane을 사용하여 여러 파일을 편집하는 Java에서 텍스트 편집기를 만들려고합니다. 인터넷에서 UndoManager를 사용하는 데 도움이되지 않습니다.

그래서 뭔가 시도했지만 작동하지 않는 것 같습니다.

사실 탭을 바꿀 때 듣는 모든 UndoableEdit를 저장하려고했습니다. 탭을 변경할 때 이전에 연 탭에 대한 UndoableEdits를 저장 한 다음 UndoManager의 편집을 정리하고 마지막으로 새 활성 탭의 UndoableEdits를 복원합니다.

내가 가진 문제는 undo/redo 버튼 상태를 업데이트하는 함수를 호출 할 때 canUndo()/canRedo() 메서드가 항상 false를 반환하지만 목록에 수정이 있다는 것입니다 ... 그리고 저는 왜 이런 일이 일어 났는지 모르겠다. 내가 무엇을 잊었는지 이해하지 못한다 ...

분명히 UndoableEdits가 "edits"Vector에 존재하지만, UndoManager는 이것을 신경 쓰지 않는다. 버튼을 강제 실행하려고하면 예외가 throw됩니다 ... (javax.swing.undo.CannotUndoException/javax.swing.undo.CannotRedoException)

제발 도와 주시겠습니까?

필요하면 주저하지 말고 자세한 정보를 요청하십시오.

감사합니다.

를 UndoManager 클래스의 내 확장 :

public class UndoManagerPerso extends UndoManager 
{ 
private static final long serialVersionUID = 8386145389216281754L; 


public ArrayList<UndoableEdit> getEdits() 
{ 
    ArrayList<UndoableEdit> listEdits = new ArrayList<UndoableEdit>(); 

    listEdits.addAll(this.edits); 

    return listEdits; 
} 

public void setEdits(ArrayList<UndoableEdit> listEdits) 
{ 
    for(UndoableEdit ue:listEdits) 
    { 
     this.addEdit(ue); 
    } 
} 

} 

내 메인 윈도우의 클래스에서이 함수의 호출 :

tabbedPane_editeur.addChangeListener(new ChangeListener() 
    { 
     @Override 
     public void stateChanged(ChangeEvent e) 
     { 
      if (e.getSource() instanceof JTabbedPane) 
      { 
       JTabbedPane pane = (JTabbedPane) e.getSource(); 
       int previousTab = f_principale.this.activeTab; 
       int activeTab = pane.getSelectedIndex(); 

       System.out.println("Selected paneNo : " + pane.getSelectedIndex() + ", précédent : " + previousTab); 

       f_principale.this.listEditeurs.get(previousTab).setListEdits(f_principale.this.undoManager.getEdits()); 
       f_principale.this.undoManager.setEdits(f_principale.this.listEditeurs.get(activeTab).getListEdits()); 

       f_principale.this.activeTab = activeTab; 

       f_principale.this.updateButtons(); 
      } 
     } 

    }); 
public void updateButtons() 
{ 
    this.btnUndo.setText(undoManager.getUndoPresentationName()); 
    this.btnRedo.setText(undoManager.getRedoPresentationName()); 
    this.btnUndo.setEnabled(undoManager.canUndo());//returns false 
    this.btnRedo.setEnabled(undoManager.canRedo());//returns false 
} 

편집 : (1 일 이상) 내가 테스트 한 UndoManader 다시 오늘, 나는 뭔가를 알아 차렸다. 실제로 UndoableEdit가 수동으로 삽입됩니다! 그러나 수정 횟수가 너무 빨리 증가하여 정상이 될 수 없습니다.

나는 기본 제한 (100)에 빨리 도달하므로 어제 전혀 작동하지 않는다고 생각하는 이유입니다. 한도에 도달하면 canUndo)/canRedo()는 false를 반환하는 것으로 보이며 버튼을 활성화 할 때 예외가 발생합니다.

어쩌면 내가 탭을 바꿀 때 뭔가 잘못 될 수 있습니다 ...하지만 뭐라구? 의견이 있으십니까? 이 부분을 살펴 보겠습니다 ...

답변

1

각 탭마다 별도의 UndoManager를 만들어야합니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 내가 마침내 한 일이며 예상대로 작동합니다. –