# ActionEvent generieren und an ActionListener weiterleiten



## 123456789 (9. Jan 2012)

Hallo,

eine Frage zu ActionEvents. Ich würde gerne inner halb einer actionPerformed() Methode einen ActionEvent generieren, welcher den Aufruf der actionPerformed() Methode eines anderen ActionListeners verursacht.

BeispielSource:

```
ActionListener1 implements ActionListener{
 public void actionPerformed(ActionEvent e) {
  ...
  if (Action.STH.equals(cmd)) {
    // do Sth.
  }
 }
}
```



```
ActionListener2 implements ActionListener{

  public void actionPerformed(ActionEvent e) {
    // create ActionEvent which will call ActionListener1.actionPerformed()
   // with the actionCommand Action.STH
  }
  
}
```


ist sowas überhaupt möglich?
In diesem Beispiel möchte ich mir nur die Source Duplizierung ersparen.

Vielen Dank,
LG


----------



## pl4gu33 (9. Jan 2012)

meinst du so ?
also gehen tut es, weiß aber nicht ob es eine tolle/saubere Lösung is 


```
public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame frame=new JFrame();
		 frame.setSize(400, 400);  		 
		 
		 JPanel panel=new JPanel();
		 JButton btn=new JButton("TEST");
		 btn.addActionListener(new Action1());
		 
		 
		 panel.add(btn);
		
		 frame.add(panel);
		 frame.setVisible(true);   		 
	}
```


```
package action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Action1 implements ActionListener{
	private Action2 mAction2;
	public Action1(){
		mAction2=new Action2();
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("ACTION1");
		
		mAction2.actionPerformed(arg0);
		
	}

}
```


```
package action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Action2 implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("ACTION2");
	}

}
```


----------



## André Uhres (9. Jan 2012)

123456789 hat gesagt.:


> Ich würde gerne inner halb einer actionPerformed() Methode einen ActionEvent generieren, welcher den Aufruf der actionPerformed() Methode eines anderen ActionListeners verursacht.
> ...ist sowas überhaupt möglich?



Du brauchst lediglich eine Referenz auf den anderen Listener. Dann kannst Du darüber seine "actionPerformed"-Methode aufrufen, der Du das neue ActionEvent übergibst.

Gruß,
André


----------



## Marco13 (9. Jan 2012)

Nebenbei: Das klingt strukturell SEHR unschön. Warum soll in der actionPerformed mehr gemacht werden, als eine Methode aufzurufen? Also eher sowas wie

```
ActionListener1 implements ActionListener{
 public void actionPerformed(ActionEvent e) {
    doSomething1(e.getActionCommand());
 }
}

ActionListener2 implements ActionListener{
  public void actionPerformed(ActionEvent e) {
      doSomething(Action.STH);
  }
}

private void doSomething(String sommand)
{
  if (Action.STH.equals(command)) {
    // do Sth.
  }
}
```
oder so...


----------



## 123456789 (14. Jan 2012)

Danke für eure Antworten.

Leider hab ich keine Referenz auf den anderen ActionListener. Die von Marco13 beschriebene Auslagerung der Funktionalität hab zurzeit auch in Verwendung. 
Ich hab nur gehofft dass es eineMöglichkeit für ein Redirect des ActionEvents gibt.

Vielen Dank,
LG


----------



## André Uhres (15. Jan 2012)

123456789 hat gesagt.:


> Redirect des ActionEvents



Für einen Redirect musst Du die Richtung kennen, in die Du umleiten willst .

Wenn Du den Listener nicht kennst, musst Du zumindest das Subjekt kennen, das vom Listener beobachtet wird. Wenn das Subjekt eine Component ist, wäre z.B. ein [c]Component#dispatchEvent[/c] möglich. Vielleicht kannst Du aber auch über eine im Subjekt definierten Methode (wie z.B. [c]getActionListeners[/c]) auf den/die ActionListener zugreifen.

Gruß,
André


----------



## irgendjemand (15. Jan 2012)

ich würde hier grundlegend die struktur ändern ..

ich persönlich finde es nicht gerade "sauber" wenn man einem objekt über eine anonyme klasse einen listener zuweist ...

man sollte dann eher der klasse "implements ActionListener" mitgeben und dann beim adden [c]addActionListener(this)[/c] verwenden ...

so hat man eine zentrale methode von der aus man auch zugriff auf alle klassen- und instanz- objekte und methoden hat ...

aber ihr könnt mich gerne aufklären welchen "sinn" anonyme Listener haben ...


----------



## bERt0r (15. Jan 2012)

Wenn deine View Klasse sämtliche EventListener Implementiert kann das schon mal den Rahmen sprengen. Ich würde nicht wollen z.B bei einem JTable, dass diese internen Listener Methoden nach aussen sichtbar sind.
Besonders in Bezug auf die Komposition vs Vererbung Debatte passt mMn genau hier die Vererbung schlecht, weil ja View und Controller was verschiedenes sein sollen.

Ich bin da eigentlich nicht festgelegt: 
Ist der Code im Listener kurz -> annonymer Listener.
Ist der Code länger, bezieht sich aber nur auf die eine Komponente -> annonymer Listener, der Funktion aufruft.
Ist der Listener allgemeingültig oder steuert mehrere Objekte an -> eigene Listener Klasse


----------



## irgendjemand (15. Jan 2012)

ja ok .. geb mich geschlagen ... so macht das natürlich sinn ...
gerade in bezug auf vererbung *daran hab ich ja mal überhaupt nich gedacht xD*

aber da du MVC ansprichst : ist es nicht "besser" bzw "sauberer" wenn man im MVC-pattern die listener grundsätzlich komplett auslagert und diese in verbindung zum controller bringt ? *ja : davon abgesehen das die events natürlich über das view erzeugt werden ...*


----------



## Gast2 (15. Jan 2012)

irgendjemand hat gesagt.:


> ich persönlich finde es nicht gerade "sauber" wenn man einem objekt über eine anonyme klasse einen listener zuweist ...
> 
> man sollte dann eher der klasse "implements ActionListener" mitgeben und dann beim adden [c]addActionListener(this)[/c] verwenden ...



Genau falsch herum
Eine anonyme Klasse ist "sauberer" als addXyzListener(this);
Weil sonst ist die View und der Controller(ActionListener) direkt miteinander verbunden.

```
public class View implements ActionListener (Controller)
```
sagt doch schon alles aus


----------



## Gast2 (15. Jan 2012)

irgendjemand hat gesagt.:


> aber da du MVC ansprichst : ist es nicht "besser" bzw "sauberer" wenn man im MVC-pattern die listener grundsätzlich komplett auslagert und diese in verbindung zum controller bringt ? *ja : davon abgesehen das die events natürlich über das view erzeugt werden ...*



Anonyme Listenner bzw. Controller sind vollkommen in Ordung. Wenn du für jeden Button extra den Controller auslagerst nur um ein oder 2 Methoden aufzurufen ist das einfach nur ein riesiger Aufwand.

Es macht Sinn wenn der Listener öfters wiederverwendet wird.


----------



## irgendjemand (15. Jan 2012)

ja klar .. so erklärt gibt das natürlich sinn *kenne mich mit MVC leider nicht so gut aus und schreibe sowas daher immer "dirty" ... werd ich mir auf jeden fall abgewöhnen*

das mit dem auslagern meinte ich eigentlich eher so das man ein listener *controller* für alle nimmt ...
also halt eine klasse für alle ActionListener ...

das es nicht schlau ist wirklich jeden listener in seine eigene klasse auszulagern ist mir selbst klar ... war ja aber auch nicht das was ich ausdrücken wollte ...


----------



## Gast2 (15. Jan 2012)

irgendjemand hat gesagt.:


> ja klar .. so erklärt gibt das natürlich sinn *kenne mich mit MVC leider nicht so gut aus und schreibe sowas daher immer "dirty" ... werd ich mir auf jeden fall abgewöhnen*


Musst mal schauen hier hats jede Menge Beispiele im Forum...



irgendjemand hat gesagt.:


> das mit dem auslagern meinte ich eigentlich eher so das man ein listener *controller* für alle nimmt ...
> also halt eine klasse für alle ActionListener ...



Das wird aber sehr schnell unübersichtlich und unnötig komplex

EDIT:
Hier findest eigentlich alles 
http://www.java-forum.org/awt-swing-swt/128242-mvc-anfaengen-2.html


----------

