Wie mache ich einen Eventdispatcher?

Status
Nicht offen für weitere Antworten.
M

madflanderz

Gast
Ich bin seit gestern am rumsuchen und komme einfach nicht weiter. ich bin eigentlich flash programmierer und ich suche nach einer möglichkeit meine klassen über Events lose zu koppeln so wie in ActionScript mit Eventdispatchern. Wo und wie kann man da ansetzen?

Das einzige was ich gefunden habe ist erstmal Observer/Observable, hier mal etwas code der aber leider nicht funktioniert.

class MyObservable
Code:
package de.zweimaleins.asterisk.models;

import java.util.Observable;

public class MyObservable extends Observable {
	
	public void startTest()
	{
		this.notifyObservers();
	}
	
}

class MyObserver
Code:
package de.zweimaleins.asterisk.test;

import java.util.Observable;
import java.util.Observer;

public class MyObserver implements Observer {

	public MyObserver() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub
			
		System.out.print("MyObserver.update()");
	}

}


Test Case
Code:
package de.zweimaleins.asterisk.test;

import java.util.Observable;
import java.util.Observer;
import de.zweimaleins.asterisk.models.*;

public class ObserverTest implements Observer {

	private User user;
	
	@Override
	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("ProgrammersBase.NET \u0021");

		User user = new User();
		MyObserver obs = new MyObserver();
		
		
		user.addObserver( obs );
		
		// hier sollte jetzt eigentlich obs.update() aufgerufen werden, geht aber nicht
		user.startTest();
		
	}

}

Selbst wenn die version funktionieren würde reicht sie mir eigentlich nicht aus, ich will am liebsten echte events versenden die auch daten enthalten können. was habe ich da für möglichkeiten?



gruß mad
 

Wildcard

Top Contributor
Ist schon richtig das man in Java das Observer Pattern verwendet, allerdings spricht man meistens von Listenern.
Schau dir einfach mal zB einen MouseListener an. Dort wird auch Information im Event mitgegeben.
 

musiKk

Top Contributor
Bevor das Observable die Observer benachrichtigt, muss noch setChanged() aufgerufen werden, um zu sagen, dass sich auch tatsächlich etwas geändert hat. Wenn das nicht der Fall ist (wie noch bei dir), dann gibts auch keine Benachrichtigung.

Zum anderen kann ich dir leider nicht helfen. Ich kenne das Konzept aus Flash nicht. Kannst du das "Event" nicht über notifyObservers() übergeben?
 

FArt

Top Contributor
Auch das sind "echte Events". Wenn noch Daten mitgeliefert werden sollen, musst du nur die notify-Methode anpassen.

Ein Dispatcher macht das ganze asynchron, d.h. die Benachrichtigungen landen in einer Queue (notify kommt sofort zurück). Danach greift der Dispatcher das Event auf und verteilt es an registrierte Listener.

Vielleicht tut es ja auch eine fertige Implementierung: JMS.
 

Marco13

Top Contributor
Die vorgegebenen Oberver/Observable-Klassen sind IMHO nicht geeignet, um darauf einen eigenen Event-Mecahnismus aufzubauen. Man kann schlecht Event-Objekte werfen, und wenn man 10 Listener bräuchte, gäbe es ja immernoch nur die eine update-Methode. Man kann sich aber auch Listener- und Event-Klassen selbst schreiben, wenn man nicht auf ein fertiges Framework zurückgreifen will.
 
M

madflanderz

Gast
danke für eure schnelle hilfe. ich habe es jetzt geschafft ein beliebiges object zu übergeben und in die update methode zu casten. wenn ich jetzt quasi verschiedene event typen verarbeiten will wäre dies hier ein akzeptabler weg?

Code:
@Override
	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub
			
		MyEvent e = (MyEvent) arg1 ;
		
		
		if( e.type == MyEvent.ON_START )
		{
			this.onStart();
		}
		else if( e.type  == MyEvent.ON_STOP )
		{
			this.onStop();
		}
		else if( e.type  == MyEvent.ON_SOMETHING_ELSE )
		{
			this.onSomethingElse();
		}


	}


was ich aber am liebsten hätte wäre folgendes (pseudocode):

Code:
// listener anmelden
myDispatcher.addEventListener( MyEvent.ON_START, myListener.onStart );
myDispatcher.addEventListener( MyEvent.ON_START, myOtherListener.onOtherStartFunc );
myDispatcher.addEventListener( MyEvent.ON_STOP, myListener.onStop );

// events dispatchen
myDispatcher.dispatchEvent( new MyEvent(MyEvent.ON_START,myDispatcher ) ) // myListener.onStart() und myOtherListener.onOtherStartFunc/( wird ausgeführt
myDispatcher.dispatchEvent( new MyEvent(MyEvent.ON_STOP,myDispatcher ) ) // myListener.onStop() wird ausgeführt
 

ARadauer

Top Contributor
ich schreib mir solche dinge gerne selber...

Code:
import java.util.ArrayList;
import java.util.HashMap;


public class MyDispatcher {
   
   public static void main(String[] args) {
      MyDispatcher d = new MyDispatcher();
      d.addEventListener(MyEvent.EVENT_A, new AEventListener());
      d.addEventListener(MyEvent.EVENT_A, new AEventListener());
      d.addEventListener(MyEvent.EVENT_B, new BEventListener());
      
      d.dispatchEvent(new MyEvent(MyEvent.EVENT_A, "Event A"));
      d.dispatchEvent(new MyEvent(MyEvent.EVENT_B, "Event B"));
   }
   
   
   private HashMap<Integer, ArrayList<MyEventListener>> listeners= new HashMap<Integer, ArrayList<MyEventListener>>();   
   
   public void addEventListener(int type, MyEventListener listener){
      ArrayList<MyEventListener> list = listeners.get(type);
      if(list==null)
         list = new ArrayList<MyEventListener>();
      list.add(listener);
      listeners.put(type, list);
   }

   public void dispatchEvent(MyEvent event){
      ArrayList<MyEventListener> list = listeners.get(event.getTyp());
      if(list==null)
         return;
      for(MyEventListener l:list )
         l.eventPosted(event);
   }
    
}
Code:
public class MyEvent{
      public static final int EVENT_A = 1;
      public static final int EVENT_B = 2;
      
      int typ;
      Object payload;
      
      public MyEvent(int typ, Object payload) {
         super();
         this.typ = typ;
         this.payload = payload;
      }
      public int getTyp() {
         return typ;
      }
      public void setTyp(int typ) {
         this.typ = typ;
      }
      public Object getPayload() {
         return payload;
      }
      public void setPayload(Object payload) {
         this.payload = payload;
      }
      
   }
Code:
 public  interface MyEventListener{
       public void eventPosted(MyEvent event);
   }
Code:
public class AEventListener implements MyEventListener{

   @Override
   public void eventPosted(MyEvent event) {
      System.out.println("ich bin ein A EventListener. Event:"+event.getPayload());
      
   }

}
Code:
public class BEventListener implements MyEventListener{

   @Override
   public void eventPosted(MyEvent event) {
     System.out.println("ich bin ein B EventListener. Event:"+event.getPayload());
      
   }

}

macht eigentlich genau das was du woltest oder?
 
M

madflanderz

Gast
ja, genau so in der art hätte ich das gerne. wahrscheinlich werde ich deinen code nehmen und nach meinen ansprüchen erweitern, vielen dank.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
Q TextArea - wie mache ich einen Absatz? Java Basics - Anfänger-Themen 9
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
J Was mache ich falsch in meiner Java Anwendung? Java Basics - Anfänger-Themen 11
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
Z Klassen Error: ';' expected - was mache ich falsch? Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
A Arrays addieren- Was mache ich falsch?? Java Basics - Anfänger-Themen 2
Silvascus Was mache ich falsch? Java Basics - Anfänger-Themen 15
L Variable an andere Klasse weitergeben - Was mache ich falsch? Java Basics - Anfänger-Themen 2
J Klassen Fehler Datei kopieren - was mache ich falsch Java Basics - Anfänger-Themen 19
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
K Erste Schritte Wie mache ich weiter? (Spiel-Menü) Java Basics - Anfänger-Themen 9
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
A Variablen Was mache Ich falsch? Java Basics - Anfänger-Themen 5
B Klassen Wie mache ich das "the java way"? Java Basics - Anfänger-Themen 4
A was mache ich falsch? Java Basics - Anfänger-Themen 3
J Wie mache ich ein JFrame modal Java Basics - Anfänger-Themen 30
D Wie mache ich das? Java Basics - Anfänger-Themen 2
F Ich raffs nicht! - Wie mache ich ein einfaches Java-window? Java Basics - Anfänger-Themen 54
D Muss ein Applet schreiben was Mittelwerte berechnet nur was mache ich falsch? Java Basics - Anfänger-Themen 11
T Was mache ich hier falsch? Java Basics - Anfänger-Themen 3
H Wie mache ich aus pfad\\unterpfad pfad\unterpfad? Java Basics - Anfänger-Themen 3
S Wie mache ich mir eine universelle Timermethode Java Basics - Anfänger-Themen 20
D Brauche mehr Flexibilität bei der Realisierung und weiss nicht wie ich das mache. Java Basics - Anfänger-Themen 10
D Boolean funktioniert nicht, was mache ich falsch? Java Basics - Anfänger-Themen 6
S Deserialisieren: alle Objekte ausgeben - wie mache ich das? Java Basics - Anfänger-Themen 2
M Counter erstellen - Was mache ich falsch? Java Basics - Anfänger-Themen 17
S Fehler in Javaprogramm, was mache ich falsch? Java Basics - Anfänger-Themen 9
T Button Dis/Enablen - Was mache ich falsch? Java Basics - Anfänger-Themen 3
S Was mache ich falsch? Java Basics - Anfänger-Themen 4
D Pascal'sche Drreieck. was mache ich in der ausgabe flasch? Java Basics - Anfänger-Themen 5
D Was mache ich falsch beim ScrollPane ? Java Basics - Anfänger-Themen 2
T Was mache ich falsch? File klasse. Java Basics - Anfänger-Themen 3
G Fehler: Illegal Expression. Was mache ich falsch? Java Basics - Anfänger-Themen 4
W Was mache ich Falsch?? Java Basics - Anfänger-Themen 4
N Womit mache ich ein menue Java Basics - Anfänger-Themen 2
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
P Gibt es einen anderen Weg um "{}" in IntelliJ zu schreiben? Java Basics - Anfänger-Themen 5
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
F Hat es noch einen Sinn, alte Versionen zu lernen Java Basics - Anfänger-Themen 45
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Brauche ich while != -1, wenn ich immer einen BufferedReader verwende? Java Basics - Anfänger-Themen 8
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
N Gibt es hierfür einen Shortcut Java Basics - Anfänger-Themen 5
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
K Wie verneine ich einen Regex? Java Basics - Anfänger-Themen 2
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
D Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen? Java Basics - Anfänger-Themen 11
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
Poppigescorn Mithilfe einer Arrayliste einen Notenspiegel ausgeben Java Basics - Anfänger-Themen 12
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
LetsSebi Methode, die einen arry von objekten speichert in einer datei Java Basics - Anfänger-Themen 6
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
P Welche Zeile in Tadople gibt einen compiler error? Java Basics - Anfänger-Themen 5
S First Time Mave: Wie ergänze ich einen Source-Folder? Java Basics - Anfänger-Themen 10
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
S Erste Schritte Button einen Wert zuweisen & diesen ausgeben Java Basics - Anfänger-Themen 2
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
F Hilfe für einen Anfänger! Java Basics - Anfänger-Themen 4
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
N Wie kann ich einen String wieder zusammensetzen und ausgeben lassen? Java Basics - Anfänger-Themen 9
T Fehlermeldung beim Versuch, einen String einzulesen Java Basics - Anfänger-Themen 4
J Wie kann ich z.B. einem int-Wert einen String-Wert zuweisen? Java Basics - Anfänger-Themen 2
steven789hjk543 Kann man mit Java und Eclipse einen Virus programmieren? Java Basics - Anfänger-Themen 13
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
T Einen Stern malen Java Basics - Anfänger-Themen 32
T Einen Stern malen Java Basics - Anfänger-Themen 2
L Files verschieben in einen Ordner Java Basics - Anfänger-Themen 87
A Mit JComboBox Ergebnis einen Integer aus einer anderen Klasse aufrufen. Java Basics - Anfänger-Themen 2
J Mit for Schleife einen String Rückwärts befüllen Java Basics - Anfänger-Themen 9
J Einen Buttonklick in Label anzeigen Java Basics - Anfänger-Themen 6
S Gibt es einen guten kostenlosen Online-kurs Java Basics - Anfänger-Themen 2
W Wie programmiere ich einen Potenzrechner? Java Basics - Anfänger-Themen 5
B ArrayList besitzt einen Wert zu wenig Java Basics - Anfänger-Themen 16
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben