「スタック(スイングではない)を使用する」という意味を理解していないので、うまくいけばいいと思います。 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());
[...]
}
:元に戻す/やり直しアクションの後に呼ばれなければならない次のような方法。しかし、最良のアプローチは仕様に強く依存しています。
あなたは少し明確にする必要がある場合があります。あなたは元に戻す必要がありますか?学生登録、またはテキストフィールドでの人の書き出しは?登録された学生はどこに保管していますか? – cgarciahdez
私はすべてのことを元に戻す必要があります。生徒オブジェクトはリストに格納されます。何か他のものが前にあった場合は、リストとテキストフィールドには、それは私があなたのテキストを更新し、読みやすくするために、それを軽減表示の代わりに、空白のTXTフィールド –
する必要があり、ちょうどCTR + Zのように、元に戻すことはする必要があります。 – slartidan