# ActionEvent mit Daten "füttern"?



## powerpaar (30. Nov 2011)

Hallo,

Ich habe ein kleineres Problem mit den ActionListenern. Im nächsten (größeren) Absatz beschreibe ich das grundsätzliche Problem, wen das nicht interessiert, der kann gleich zum übernächsten Springen.

Ich soll ein Programm erstellen, in dem (potentiell beliebig viele) Objekte (sagen wir vom Typ"Kind") erstellt werden können, welche

zwei timer enthalten sind
jeder dieser Timer ruft in der erzeugenden Klasse (nennen wir sie Papa) eine andere Methode auf
Kind hat Variablen, die (unbedingt) an Papa gegeben werden müssen
Kind muss von Papa grundsätzlich auch erreichbar sein
Das heist, jedes Kind muss jederzeit ein Ereigniss in Papa auslösen können, welches dazu führt, dass Papa entweder das eine oder das andere macht. Soweit, so gut, kein Problem, Actionlistener gebastelt, dem Kind übergeben, Kind schreit, Papa rennt. 
Aber wie kann jedes einzelne Kind dem Papa z.B. sagen, wo es genau ist (das Kind ist _kein_ Button)? 


Nun konkreter: *Wie schaffe ich es, dass ein erzeugtes Objekt Daten an weitergibt, die über den "String-Anteil" des ActionEvents hinausgehen?*


Ich habe mir schon ein bis zwei Gedanken darüber gemacht, so z.B. dass ein Kind schreit (also ein erzeugtes Objekt nutzt den ActionListener der erzeugenden Klasse) und Papa fragt bei all seinen Kindern nach, ob dieses es war, das geschrieen hat (also die erzeugende Klasse überprüft bei allen seinen erzeugten Objekten bestimmte booleans o.ä., die genauere Auskunft über den Status des Objekts geben).

Allerdings scheint mir das nicht sehr sinnvoll. Gibt es nicht eine bessere Lösung? Ich dachte auch schon an eine Erweiterung des ActionEvents auf weitere Parameter, aber irgendwie scheint mir das stümperhaft.


----------



## Ralph-Uwe (30. Nov 2011)

Hi,

ich kann mir vorstellen, dass Observer/Observable den entspricht, was Du suchst.

Gruß


----------



## Ralph-Uwe (30. Nov 2011)

sowas in der Richtung könnte auch funktionieren:



```
package VaterKind;

public interface VaterInterface {
	public void registriereKind(KindInterface k);
	public void entferneKind(KindInterface k);
	public void benachrichtigKinder(String nachricht);
}
```


```
package VaterKind;

public interface KindInterface {
	public void aktualisieren(String nachricht);
}
```


```
package VaterKind;

import java.util.ArrayList;

public class Vater implements VaterInterface{
	private ArrayList<KindInterface> kinder;
	private String name;
	
	public Vater(String name){
		kinder = new ArrayList<KindInterface>();
		this.name = name;
	}
	
	@Override
	public void registriereKind(KindInterface k) {
		kinder.add(k);
	}

	@Override
	public void entferneKind(KindInterface k) {
		int i = kinder.indexOf(k);
		if (i >= 0 ){
			kinder.remove(i);
		}
	}

	@Override
	public void benachrichtigKinder(String nachricht) {
		for (int i = 0; i < kinder.size();i++){
			KindInterface kind = (KindInterface)kinder.get(i);
			kind.aktualisieren(nachricht);
		}
	}

	public String getName() {
		return name;
	}
	public void helfen(Kind kind){
		System.out.println(name + " läuft zu " + kind.getName());
	}
}
```


```
package VaterKind;

public class Kind implements KindInterface{

	private Vater vater;
	private String name;

	public Kind(Vater vater, String name){
		this.vater = vater;
		this.name = name;
	}

	@Override
	public void aktualisieren(String nachricht) {
		if (nachricht.equals("komm")){
			System.out.println(getName() + " ruft: "+(vater).getName()  + " ich komme gleich!");
		}
	}

	public String getName() {
		return name;
	}
	
	public void fallen(){
		System.out.println(name + " ruft : " + vater.getName() + " ich bin gefallen");
		vater.helfen(this);
	}
}
```


```
package VaterKind;

public class TestKlasse {

	public static void main(String[] args) {
		// Vater erstellen
		Vater papa = new Vater("Groß Papa");
		// Kinder erstellen
		Kind kleinFritzchen = new Kind(papa,"Klein Fritzchen");
		Kind kleinErna= new Kind(papa,"Klein Erna");
		// Kinder bei Vater anmelden
		papa.registriereKind(kleinFritzchen);
		papa.registriereKind(kleinErna);
		// Events
		papa.benachrichtigKinder("komm");
		kleinErna.fallen();
		kleinFritzchen.fallen();
	}
}
```


----------



## turtle (1. Dez 2011)

@Ralph-Uwe: Nein, nein, Dein Hinweis zum


> ich kann mir vorstellen, dass Observer/Observable den entspricht, was Du suchst.


war schon sehr gut. Schliesslich möchten wir dem OP nicht empfehlen ein Rad noch einmal zu erfinden, oder


----------



## Ralph-Uwe (1. Dez 2011)

ok, ok hast ja recht 

funktioniert aber auch 

Gruß


----------

