편집 : 게시물의 끝에서보기 ...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를 반환하는 것으로 보이며 버튼을 활성화 할 때 예외가 발생합니다.
어쩌면 내가 탭을 바꿀 때 뭔가 잘못 될 수 있습니다 ...하지만 뭐라구? 의견이 있으십니까? 이 부분을 살펴 보겠습니다 ...
답장을 보내 주셔서 감사합니다. 이것은 내가 마침내 한 일이며 예상대로 작동합니다. –