2010-11-18 11 views
2

私はJPanelとボタンを使ってアプリケーションを開き、ユーザーがパネル上に図形を描くためにクリックします。シェイプを色付けしたり、サイズ変更したり、パネル内を移動したりすることができます。どのように私はそのようなアプリケーションのためにアンドゥとリドゥを実装するつもりですか?私はすべてのアクションが実際に実装されているアクションクラスを持っています。このクラスでは、各アクションはAbstractActionを拡張する独自のクラスです。 My Actionsクラスは基本的にネストされたクラスです。Javaの元に戻すアクションとやり直しのイベント

例えばこれは私のアクションクラスのクラスの1つです:

private class RandomAction extends AbstractAction { 
    private static final long serialVersionUID = 1L; 
    public NewAction(String text, ImageIcon icon, String desc){ 
      super(text, icon); 
      putValue(SHORT_DESCRIPTION, desc); 
     } 
     public void actionPerformed(ActionEvent e) { 

     } 
    } 

私は、ボタンを作成するときに私はすべてがある:

randButton = new JButton(Actions.RandomAction); 

答えて

4

通常/リドゥ機能を実装することによって行われている元に戻しますスタック。以前のXアクションを追跡する独自のアクションスタックを実装することができます。このアクションスタックは、ユーザーがアクションを取り消すたびにポップアウトすることができます。また、やはりREDO機能のために同様のタイプの構造を保持する必要があります。そのため、元に戻すスタックからアクションがポップされると、最初にやり直しスタックに移動する必要があります。

JavaとNetBeansを使用している場合(厳密にはNetBeans IDEを使用する必要はありませんが)、NetBeansプラットフォームを見ることができます(別途ダウンロードできます)。私は元に戻す/やり直しを多用していませんが、機能を提供しています。

私は個人的には、ユーザーが実行できる「アクション」をラップするクラスを作成していますが、これはすでに行ったことがわかります。これらのアクションを追跡するためにスタックを実装するだけで、アンドゥスタックからポップされたときにアクションの「反対」を行う必要があります。アイテムをREDOスタックに配置すると、ユーザーがREDOをクリックしたときに、REDOスタックからそのアクションをポップして、アプリケーションが通常どおりに処理できるようにすることができます。

+0

ありがとう、私は実際にこのように実装することを考えていました。 – sigfreik

0

私はNicoの投稿に同意し、元に戻す/やり直しの両方に1つのスタックを使用することができると付け加えます。

大学に戻って数年前、完全なアンドゥ/リドゥ機能が必要なデータフロー図エディタを作成しました。私は、実行可能なすべてのアクションのリストをラップし、最後に実行されたアクションへのポインタを保持するActionStackと、実行可能なユーザアクション(UndoメソッドとDoメソッドを含む)を表す抽象アクションクラスを作成しました。アクションを元に戻すと、ポインタがスタックの下に移動し、ポインタをやり直すと、ポインタが上に移動します。したがって、ユーザーが10個のアクションを実行すると、スタックにはアクション1〜10が含まれ、ポインターにはアクション10が示されます。ユーザーが5回のアンドゥを実行すると、スタックに10回のアクションが残っていますが、ポインタは5番のアクションに戻ります。ユーザーが新しいアクションを実行すると、ポインタ上のすべてのアクション(アクション6-10)が削除され、新しいアクションがスタックの最上部に追加され、それに応じてポインタが調整されます。

あなたの説明する操作は複雑すぎるとは言えませんが、より複雑な操作の場合は、子の操作で構成することを許可したい場合があります。

+0

私の現在のプロジェクトの元に戻す/やり直しの機能と全く同じことをやっています。 – almathie

+0

2つのスタックを持たないため、アプリケーションのスペースを効率的にするので、これを試すことがあります。 – sigfreik

関連する問題