2009-06-09 10 views
3

スイングがデコレータとオブザーバのパターンをどのように使用しているかを見ることができます。スイングのコマンドパターンを理解する

オブザーバー:すべてのコンポーネント(たとえば、JButton)は、observers(ActionListeners)を追加できるサブジェクトです。誰かがボタンを押すと、ActionListenersにすべてactionPerformed(ActionEvent e)と呼んで通知します。

しかし、コマンドパターンについてはどうですか?

ActionListener(例:MyActionListener)を実装するクラスを作成するときに、actionPerformed(ActionEvent e)が実行コマンドになりましたか?

actionPerformed(ActionEvent e)は、​​とupdate()の両方の方法として使用されていると私は混乱しています。私はここにいますか?

答えて

5

Here is an article that will help.基本的に、あなたがActionListenerを導出することにより、対象物との相互作用、具体的なコマンドクラスを作成することができると言っています。次に、これらの分離されたコマンドをそのイベントに登録することによって、アクションイベントの実行者が行うことを拡張できます。

+0

Thx。非常に役に立ちました:) –

+6

リンクダウンです.... – KJW

+0

ページリンクがダウン – jawath

0

興味深いそれを取ると、あなたは正しいかもしれないが、私が行っています何か、期間として、それを参照してください。実行されるアクションの理由は、状態の変更またはマウスのクリックですが、それでもコマンドパターンの意味でのコマンドです。

3

はい、そう基本的挙動及び動作はcommand patternを使用するものとして見ることができる場所をとる場合に必要とされる他の情報をカプセル化するオブジェクトを作成します。

上記連結Wikipediaの記事は、スイング中のコマンドのパターンの一例としてActionインターフェースを使用します。 ActionインタフェースはActionListenerのサブインタフェースなので、Actionを実装するクラスは、actionPerformedメソッドを実装する必要があります。

したがって、Actionを実装するクラスは、アクションが発生したときに実行されるいくつかの操作をカプセル化します。そのクラス自体はコマンドパターンに従うことがわかります。

一般的に、AbstractActionは、いくつかの方法をオーバーライドする必要があるため、Actionの実装よりも使いやすくなります。 AbstractActionを使用した例があることができます:

class MySpecialAction extends AbstractAction { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // Perform operations. 
    } 
} 

MySpecialActionは、コマンドパターンオブジェクトである - それは、アクションが行われるとき、それは示さなければならない行動を持っています。上記クラスのインスタンスを作成する際、人は次のことを試みることができる:

MySpecialAction action = new MySpecialAction("Special Action", mySpecialIcon); 

そして、アクションが複数のコンポーネントに登録することができる、などJButton S、JMenuItem Sなどを。各場合において、同じMySpecialActionオブジェクトが呼び出される。両方の場合において

JMenuItem specialMenuItem = new JMenuItem(action); 

/* ... */ 

JButton b = new JButton(action); 

、各構成要素、ボタン、メニュー項目に関連付けられているアクション、同じMySpecialActionアクション・オブジェクト、または命令を指します。わかるように、MySpecialActionオブジェクトは、アクションが発生したときに実行されるいくつかのアクションをカプセル化するため、コマンドパターンの後のオブジェクトとして機能しています。ここで

+0

ありがとうございます。私はそれを得る:) しかし、私は元に戻すことができるようにしたいとしましょう。もし私がUndoableActionインターフェースを作るならば、undo()メソッドでインターフェースActionを拡張します。その後、JButton b =新しいJButton(new MyUndoableAction());それでもアンドゥ機能はありません。 –

+0

ええと、スイングは、元に戻す方法があることを知ることはできません。 actionPerfomed()は、ボタンが押されると自動的に呼び出されます。 –

+0

@bobjink:はい、JButtonはMyUndoableActionではなくActionを必要としているので、 "元に戻す"方法がわからず、undo()メソッドを呼び出すことはありません。 MyUndoableActionが引き渡されるオブジェクトは、元に戻す処理の実装方法を知る必要があります。良いリソースを指すことはできませんが、取り消しを実装するための方法はかなりあります。 (続き...) – coobird

0

は、それが私の感想です:

http://blue-walrus.com/2011/10/swing-and-design-patterns-%E2%80%93-part-3-command-pattern/

鍵は、あなたのアクションがinterchangebale単位であるということです。このアクションは、多くのボタンやメニューの後ろに置くことができます。例えば。 「保存」メニューオプションの後ろに「保存」アクションが表示され、「保存」アイコンの後ろに表示されます。