2

UndoManager を使用して元に戻す/やり直し機能を理解し、それを MVC モデルと統合するのに問題があります。

さまざまなメソッド (モデル、ビュー、またはコントロール) を配置する場所がわかりません。また、元に戻すマネージャーの使用方法もまだわかりません。

私のコントロール クラスは UndoableEditListener を実装します。

private UndoManager manager = new UndoManager();

そして:

public void actionPerformed(ActionEvent e) {
   if (e.getActionCommand().equals("Undo")) {    
      try {
          manager.undo();   
      } catch (CannotUndoException ex) { 
          ex.printStackTrace(); 
      }
   }
}

ここまでは理解できましたが、あとはどうすればいいのかわかりません。モデルとビュークラスにさらに追加する必要があることはわかっていますが、どこにあるのかわかりません。次のクラスを受講する必要がありますか?

public class UndoAction extends AbstractAction {}

public void undoableEditHappened(UndoableEditEvent e) {

テキストフィールドに整数を配置するだけで、これを元に戻したい.ビュークラスのテキストフィールドに数値を設定する.これを可能な限り簡単な方法で達成したい. これは私のassgのマイナーな部分ですが、うまくいきません!!

================================================== ======== これが私のコードのより詳細な説明です。

モデル、ビュー、およびコントロールのパッケージがあります。

Contol には次のものがあります: ButtonGUIControl.java、両方を実装します。

    ActionListener and 
    UndoableEditListener.


    final UndoManager manager = new UndoManager();

actionPerformed メソッドでは、

    if (e.getActionCommand().equals("Undo")){

             try {

                    manager.undo();
                }

そして:

    public void undoableEditHappened(UndoableEditEvent evt) {
          manager.addEdit(evt.getEdit());

}

ビュー: JTextField を拡張する Grid.java は、GUI に数値を表示する必要がある場合に、以下を追加します:(モデルは単に私の Model クラスのインスタンスです)

    getDocument().addUndoableEditListener(new ButtonGUIControl(model));

UndoManager が別のパッケージで作成されているためでしょうか? これをデバッグする方法が本当にわかりません!!

それが役に立ったら、コード全体を投稿できます。これを私のmvcモデル構造と統合する方法がわかりません。

4

2 に答える 2

3

一歩下がってください。ここでの全体的な考え方は、ユーザーがアプリを使用して何かに一連の変更を加えるということです。テキストエディタが良い例です。文字や行を挿入したり、再度削除したり、テキストを他のテキストに置き換えたり、テキストをスクロールしたりできます。MVC でこれをサポートするには、状態を保持するモデルとそれを表示するビューがあります。

あなたの最初の本能は、ビューがモデルに直接アクセスし、ユーザーが変更を加えるたびにビューを更新することかもしれませんが、その実装でそれらの変更を元に戻すことは非常に困難です。代わりに、ユーザーがその変更を実行できるクラスで行うことができるすべての種類の変更をエンコードし、後でその変更を元に戻すことができます。

たとえば、テキストを挿入するアクションは、挿入ポイントの文字オフセットと挿入される文字列を認識しているクラスによって実装されます。実行アクションはオフセットに文字列を挿入し、元に戻すアクションはその挿入ポイントの後の適切な数の文字を削除します。削除を処理する別のクラス、スクロールなどを処理する別のクラスがあります。

ユーザーが何らかのアクションを実行するたびに、ビューはこれらの UndoableEdit クラスの 1 つを作成し、インスタンスにそれ自体を実行するように指示します (redo())。実行したら、その UndoableEdit を、ユーザーがこれまでに実行したすべてのアクションを表す UndoableEdit インスタンスのリストの最後に配置します。このリストにより、元に戻す要求、やり直し要求、および実際の編集アクションの任意のシーケンスを非常に簡単にサポートできます (その結果、より多くの UndoableEdit がリストに追加されます)。

それであなたの質問に戻ります。アプリで取り消しとやり直しをサポートする必要がある場合は、UndoableEdit のリストを管理し、必要に応じて取り消しとやり直しを実行する UndoManager を実装する必要があります。また、ユーザーが UI に対して行う操作の種類ごとに 1 つずつ、多数の UndoableEdits を実装する必要があります。リスナーに関しては、あなたが本当にそれをする必要があるとは思えません。

于 2012-10-07T21:55:30.970 に答える
1
  1. 単純な取り消し/やり直しだけが必要な場合は、 UndoManagerをそのまま使用できます。サブクラス化やカスタマイズは一切必要ありません。
  2. JTextField (より具体的にはそのモデルであるDocument ) には、元に戻すためのサポートが組み込まれています。つまり、 UndoableEditの実装を記述する必要もありません。 UndoableEdit オブジェクトは自動的に作成されます (実際には、AbstractDocument.DefaultDocumentEventは UndoableEdit を実装しています)。
  3. 完全な簡単な実例はこちら
于 2012-10-07T22:39:41.043 に答える