Swing - Aktionen wiederverwenden

Migu

Mitglied
Hallo

ich habe folgendes Problem bzw. Frage bei Swingapplikationen.
Sagen wir mal ich habe eine Applikation mit eine Menüleiste, eine Toolbar und verschiedene Panels.

So nun möchte ich zB. ein Aktion implementieren die über die Menüleiste, Toolbar und zB über ein PopUp in den Panels aufgerufen werden kann.
Mein Problem besteht darin sowas zu implementieren, also was für eine Strategie/Technik bei so einem Fall angewendet wird.
Was benutzt ihr für Techniken?

Was mich durcheinander bringt ist das die Logik der Aktion immer verschieden sein kann, je nachdem auf welches Element es aufgerufen bzw angewandt wird.
Deshalb dachte ich mir die Aktion als abstrakte Klasse zu definieren und dann die entsprechende Logikmethode zu überschreiben.

Nur weiss ich nicht wirklich wie...
Wäre über HIlfe dankbar.

Danke schon mal im Vorraus
 
Zuletzt bearbeitet:
Danke für die Antwort!
Aber die standard Swing methode (von AbstractAction abzuleiten und actionPerformed zu überschrieben) ist doch schon ein Command Pattern.

Ich verstehe irgendwie trotzdem nicht wie man die unterschiedliche Logik implementiert...
Muss man für jedes Auftreten der Action eine eigene Implementierung und somit ein neues Objekt erzeugen?
Also zB wenn man eine "changeLanguage" Action hätte würde man für zwei verschiedene Panels jeweils eine eigene Implementierung haben (zwei neue Objekte)?
 
Ich verstehe nicht warum eine Action ( welche du als Klasse von AbstractAction ableitest) mehrere implementierungen haben sollte.

Wenn du eine Action definierst welche sich um das Schließen eines Frames kümmert, dann kannst du diese Action einfach einem JMenuItem und oder auch einem JButton in z.B einer JToolBar zuweisen,
trotzdem kümmert sich dann diese Action nur um das Schließen des Frames, die Anzahl an Klassen steigt somit ( unter verwendung des pattern, werlches auch der Nachteil ist ) parallel zu den erforderlichen / gewünschten Actions.

Ausweg / Alternative wäre Observer Pattern welches eine Weiterentwicklung der Command Patterns ist.

aber du hast recht damit das wenn deine Gui keine Referenz auf die jeweilige Action hält du immer an besagter stelle eine Instanz erzeugen musst.

z.B

Java:
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import editor.enums.FileMenu;
import editor.gui.Gui;


@SuppressWarnings("serial")
public class CloseAction extends AbstractAction{

	private Gui gui;
	
	public CloseAction(Gui gui){
		super(FileMenu.CLOSE.value());
		this.gui = gui;
	}
	
	@Override
	public void actionPerformed(ActionEvent e){
		JTabbedPane tab = gui.getWorkBench().getTabbedPane();
		gui.removeTab((JComponent)tab.getSelectedComponent());
	}
}

könnte man dann hier (JMenu)

Java:
JMenuItem close = new JMenuItem(new CloseAction(gui));

oder auch einfach hier einsetzen (JToolBar)

Java:
JButton close = new JButton(new CloseAction(gui));
 
Zuletzt bearbeitet:
Danke für den Codeschnipsel.
In deinem Fall ist die action global, also die Logik ist immer gleich egal wo diese Action aufgerufen wird (Button oder Toolbar)

Aber was ist zB wenn man zwei Panels hat und eine Action "changeElementsColorAction" die die Farbe der Element in dem jeweiligen Panels ändert soll in einem PopUp (pro panel) verfügbar sein.
Wenn die Panels verschiedene Elemente haben dann muss die Logik der Action auch verschieden sein oder nicht?
Ansonsten könnte man ja die verschiedenen Elementen nicht ansprechen.
Man müsste dann eine neue "changeElementsColorAction" pro Panel definieren (evtl als inner class) und jeweils ein eigenes Action object.
 
Zuletzt bearbeitet:
Ja aber dann ist das nicht die gleiche Action.

Wenn ich eine Action habe, die das FENSTER blau macht und eine andere Action, die ein Panel Schwarz macht, dann sind das verschiedene Actions.

Es sei den die beiden zu ändernden Panels implenmentieren changeColor(Color r) z.B. von einem Interface, dann hast du nur eine Action aber dennoch zwei Implementierungen.

Also ich verstehe das Problem hier nicht ganz.
 
Du übergibst der Action einfach eine Referenz auf den panel, dessen Elemente Du ändern möchtest, und bietest im panel entweder eine dementsprechende Methode an und delegierst an die Elemente selbst, oder holst dir in der Action per getter die Element und wendest darüber dann beliebige Aktionen an.

Ersteres halte ich für die schönere Lösung.

Falls ich dich richtig verstehe 🙂
 
Zuletzt bearbeitet:
JavaMeister hat Recht. Definiere ein Interface und implementiere es für deine jeweiligen Panels. Am besten ein MasterPanel der eine Basisimplementierung der Interface-Methoden hat. Dann leitest du deinen speziellen Panels von diesem ab und überschreibst bei Bedarf die Action-Methoden. Da die ActionLogik sich nach dem Panel richten soll, ist dies besser als 20 verschiedene ActionMethoden zu entwickeln.
 

Zurück
Oben