2009-06-09 13 views
3

Ich kann sehen, wie Swing Decorator und Observer-Muster verwendet.Befehlsmuster in Swing verstehen

Beobachter: Jede Komponente (z. B. JButton) ist ein Thema, das observers(ActionListeners) hinzufügen kann. Wenn jemand einen Knopf drückt, benachrichtigt er alle seine ActionListeners, indem er ihre actionPerformed(ActionEvent e) nennt.

Aber wie wäre es mit Befehlsmuster?

Wenn ich Klassen mache, die ActionListener implementiert (zB: MyActionListener) ist der actionPerformed(ActionEvent e) jetzt der Befehl ausführen?

Es verwirrt mich, dass actionPerformed(ActionEvent e) als execute() und update() Methode verwendet wird. Bin ich hier?

Antwort

5

Here is an article that will help. Grundsätzlich heißt es, Sie können konkrete Befehlsklassen erstellen, die mit einem Zielobjekt interagieren, indem Sie den ActionListener ableiten. Dann können Sie erweitern, was ein Aktionsereignis-Aufrufer tun wird, indem Sie diese entkoppelten Befehle registrieren.

+0

Thx. War sehr hilfreich :) –

+6

Link ist runter .... – KJW

+0

Seite Link ist runter – jawath

0

Interessante nehmen und Sie könnten Recht haben, aber ich sehe es als etwas, das durchgeführt wird, Punkt. Der Grund für die Ausführung der Aktion kann eine Statusänderung oder ein Mausklick sein, aber es ist immer noch ein Befehl im Sinne des Befehlsmusters.

3

Ja, also im Grunde ein Objekt zu machen, das das Verhalten und andere Informationen einkapselt, die benötigt werden, wenn eine Aktion stattfindet, kann als die Verwendung der angesehen werden.

Der oben verlinkte Wikipedia-Artikel verwendet die Schnittstelle Action als Beispiel für das Befehlsmuster in Swing. Die Action Schnittstelle ist eine Subschnittstelle von ActionListener, so dass eine Klasse, die Action implementiert, die Methode actionPerformed implementieren muss.

Daher kapselt eine Klasse, die Action implementiert, einige Operationen, die ausgeführt werden, wenn eine Aktion auftritt. Und diese Klasse selbst kann dem Befehlsmuster folgen.

Wenn es um die Implementierung geht, kann eine AbstractAction im Allgemeinen einfacher zu verwenden als die Implementierung Action, da es mehrere Methoden hat, die überschrieben werden müssen. Ein Beispiel AbstractAction kann mit sein:

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

Die MySpecialAction ist ein Befehlsmusterobjekt - es das Verhalten hat es ausstellen muss, wenn eine Aktion stattfindet. Wenn die obige Klasse instanziiert wird, könnte man versuchen, die folgenden Schritte aus:

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

Dann kann die Aktion auf mehrere Komponenten registriert werden, wie JButton s, JMenuItem s und so. In jedem Fall wird die gleiche MySpecialAction Objekt genannt:

JMenuItem specialMenuItem = new JMenuItem(action); 

/* ... */ 

JButton b = new JButton(action); 

In beiden Fällen die Aktion, die mit jeder Komponente, die Taste und den Menüpunkt finden Sie in der gleichen MySpecialAction Aktionsobjekt oder Befehl zugeordnet ist. Wie wir sehen können, funktioniert das Objekt MySpecialAction als ein Objekt, das dem Befehlsmuster folgt, da es eine Aktion kapselt, die ausgeführt werden soll, wenn eine Aktion stattfindet.

+0

Vielen Dank. Ich bekomme es :) Aber sagen wir, ich wollte in der Lage sein, rückgängig zu machen. Wenn ich eine Schnittstelle mache, die UndoableAction ist, die die Schnittstelle Action mit der Methode undo() erweitert. Dann JButton b = neue JButton (new MyUndoableAction()); hätte noch keine Funktionalität rückgängig gemacht. –

+0

Ehm damit meine ich, Swing kann nicht wissen, dass es eine Undo-Methode gibt. actionPerfomed() wird automatisch aufgerufen, wenn eine Schaltfläche gedrückt wird. –

+0

@bobjink: Ja, das JButton erwartet eine Aktion und keine MyUndoableAction, daher weiß es nicht, wie man "rückgängig machen" kann, und es ruft niemals die Methode undo() auf. Die Objekte, an die MyUndoableAction übergeben wird, müssen wissen, wie das Rückgängigmachen implementiert werden kann. Ich kann nicht auf eine gute Ressource verweisen, aber ich vermute, es gibt einige Anleitungen zur Implementierung eines Undo. (Fortsetzung ...) – coobird