2016-11-02 12 views
0

스택 (스윙이 아닌)을 사용하여 "실행 취소"및 "다시 실행"버튼을 만들려고합니다.스택을 사용하여 실행 취소/다시 실행 방법 구현

"실행 취소"를 클릭하면 텍스트 필드, 목록 및 모든 항목을 실행 취소/다시 실행해야합니다. 나는 팝, 푸시 등을 사용해야 만한다는 것을 안다.하지만 스택에 무엇을 넣을 까? 텍스트 필드 값? 내용을 나열 하시겠습니까?

예 :

  • 나는 학교에서 학생을 등록합니다. 텍스트 필드에서
    • 학생 정보를 정기적으로 학생들의 목록은 새로운 학생 나는이를 다시 설정하려면 어떻게

을 포함

  • 을 변경?

    그리고 스택에 프로젝트 데이터의 현재 상태를 저장하는 방법이 있습니까?

  • +0

    조금 더 명확하게해야 할 수도 있습니다. 실행 취소하려면 정확히 무엇이 필요합니까? 학생 등록, 또는 텍스트 필드에 사람들이 쓰는 것은 무엇입니까? 등록 된 학생은 어디에 보관합니까? – cgarciahdez

    +0

    모든 것을 취소해야합니다. 학생 객체는 목록에 저장됩니다. 목록 및 텍스트 필드는 ctr + z와 마찬가지로 실행 취소해야합니다. 이전에 다른 것이 있으면 빈 txt 필드 대신 표시해야합니다. –

    +0

    텍스트를 업데이트하고 읽기 쉽도록 줄였습니다. – slartidan

    답변

    2

    "스택 (스윙이 아님) 사용"이 무엇을 의미하는지 이해하지 못했기 때문에 잘 됐습니다. 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()); 
        [...] 
    } 
    

    당신은 또한 사람들을 결합 할 수있는 실행 취소/재실행 구현의 두 가지 접근 방식의 장점을 가지고합니다. 그러나 최선의 방법은 사양에 따라 크게 달라집니다.