"스택 (스윙이 아님) 사용"이 무엇을 의미하는지 이해하지 못했기 때문에 잘 됐습니다. A Stack
은 데이터 구조이고 스윙은 UI 프레임 워크입니다. 그래서 그것들은 기본적으로 서로 관련이 없습니다.
실행 취소/다시 실행은 일반적으로 다음 방법 중 하나를 사용하여 구현됩니다. 어느 것을 사용해야하는지는 원하는 실행 취소/다시 실행 동작에 따라 다릅니다.
명령 패턴을 사용한 실행 취소/다시 실행.
같은 것을 보일 것이다이 방법을 구현 : 당신이 실제로 주어진 학생을 저장하기 위해주의해야한다 액션을 구현하는 StudentSaveCommand
클래스의 do()
구현 예에서
public interface ICommand {
void do();
void undo();
}
public class StudentSaveCommand implements ICommand {
public StudentSaveCommand(Student student) { ... }
[...]
}
을 데이터를 데이터베이스에 삽입하거나 파일에 저장하거나 단순히 목록에 추가하는 것입니다. undo()
구현에서는 do()
구현을 되돌리려는 작업을 구현합니다. 데이터베이스에서 삭제, 파일 삭제 또는 목록에서 제거.
결국이 같은 것을 할 것 Stack
의를 사용하여 실행 취소/다시 실행 기능을 구현하려면 :
public void btnSaveStudentClickHandler() {
ICommand c = new IStudentSaveCommand(theStudentFromGUI);
c.do();
_redoStack.clear();
_undoStack.push(c);
}
public void btnUndoClickHandler() {
ICommand undoCommand = _undoStack.pop();
undoCommand.undo();
_redoStack.push(undoCommand);
}
public void btnRedoClickHandler() {
ICommand redoCommand = _redoStack.pop();
redoCommand.do();
_undoStack.push(redoCommand);
}
쉽게 내가 구현하는 것이 당신의 GUI로 모델의 변경 사항을 반영하기를/데이터 바인딩의 일종을 사용 . 보시다시피,이 접근법은 매우 세분화 된 수준에서 실행 취소/다시 실행을 구현하는 것이 적절하지 않습니다. 텍스트 상자에서 학생 이름 변경. 여기에 두 번째 접근 방식이 적용됩니다. Memento Pattern를 사용
실행 취소/재실행.
이 패턴을 사용하면 개체의 상태를 저장하고 복원 할 수 있습니다. a Student
.나는 또한 데이터 바인딩을 선호하거나를 구현하는 것 Student
개체에 수행 된 변경 사항을 반영하기 위해
public void txtStudentNameLostFocusHandler() {
Memento sm = student.getSavedState();
_redoStack.clear();
_undoStack.push(sm);
}
public void btnUndoClickHandler() {
Memento m = _undoStack.pop();
student.restoreSavedState(m);
_redoStack.push(m);
}
// [...] Redo implementation straight-forward
:이 패턴과 Stack
를 사용하여 실행 취소/재실행 기능에 대한 구현은 코드가 아마 다음과 같이 보일 것이야 실행 취소/재실행 작업 후에 호출해야하는 다음과 같은 방법
public void updateStudentGUI(Student student) {
txtName.setText(student.getName());
[...]
}
당신은 또한 사람들을 결합 할 수있는 실행 취소/재실행 구현의 두 가지 접근 방식의 장점을 가지고합니다. 그러나 최선의 방법은 사양에 따라 크게 달라집니다.
조금 더 명확하게해야 할 수도 있습니다. 실행 취소하려면 정확히 무엇이 필요합니까? 학생 등록, 또는 텍스트 필드에 사람들이 쓰는 것은 무엇입니까? 등록 된 학생은 어디에 보관합니까? – cgarciahdez
모든 것을 취소해야합니다. 학생 객체는 목록에 저장됩니다. 목록 및 텍스트 필드는 ctr + z와 마찬가지로 실행 취소해야합니다. 이전에 다른 것이 있으면 빈 txt 필드 대신 표시해야합니다. –
텍스트를 업데이트하고 읽기 쉽도록 줄였습니다. – slartidan