2016-11-02 5 views
0

スタック(スイングではない)を使用して「元に戻す」と「やり直す」ボタンを作成したいと思います。スタックを使用した元に戻す/やり直しメソッドの実装

「元に戻す」をクリックすると、テキストフィールド、リスト、すべてを元に戻す/やり直す必要があります。私は、ポップ、プッシュなどを使用しなければならないことを知っている。しかし、私は何をスタックに入れますか?テキストフィールド値?リストの内容は?

例:

  • 私は学校で学生を登録します。テキストフィールドで
    • 学生に関する情報は、学生のリストは、新しい学生、私はこれらをリセットするにはどうすればよい

が含まれてい

  • を変更していますか?

    また、プロジェクトのデータの現在の状態をスタックに保存する方法はありますか?

  • +0

    あなたは少し明確にする必要がある場合があります。あなたは元に戻す必要がありますか?学生登録、またはテキストフィールドでの人の書き出しは?登録された学生はどこに保管していますか? – cgarciahdez

    +0

    私はすべてのことを元に戻す必要があります。生徒オブジェクトはリストに格納されます。何か他のものが前にあった場合は、リストとテキストフィールドには、それは私があなたのテキストを更新し、読みやすくするために、それを軽減表示の代わりに、空白のTXTフィールド –

    +0

    する必要があり、ちょうどCTR + Zのように、元に戻すことはする必要があります。 – 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()実装を元に戻すアクションを実装します。データベースから削除したり、ファイルを削除したり、リストから削除することができます。簡単にデータバインディングのいくつかの並べ替えを使用して/私は実装し、あなたのGUIのモデルに変更を反映するには

    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); 
    } 
    

    :最後に、あなたがこのような何かをするだろうStack Sを使用して元に戻す/やり直し機能を実装するには

    。ご覧のとおり、このアプローチは、非常にきめ細かなレベルで元に戻す/やり直しを実装するのに適していません。テキストボックスで生徒の名前を変更する。ここでは第2のアプローチが有効になります。 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()); 
        [...] 
    } 
    

    :元に戻す/やり直しアクションの後に呼ばれなければならない次のような方法。しかし、最良のアプローチは仕様に強く依存しています。

    関連する問題