Hintergrundinformation der Ereignisbehandlung

memo1990

Aktives Mitglied
Hallo zusammen,

ich bin gerade dabei mich in Java (Buch: "Jetzt lerne ich Java 7" :rtfm:) einzulernen und bin mit meinen Gedanken ab und zu wieder bei den "Ereignisbehandlungen" von GUI-Komponenten, wie das im Hintergrund genau funktioniert bzw. wie die Ereignisbehandlung genau abläuft.
Ich möchte es besser verstehen, damit ich später damit besser umgehen kann. :)

Wenn ich das so richtig verstanden habe, erzeugt jede GUI-Komponente, z.B. ein Button, Menüeintrag, etc. ein Objekt der Klasse "ActionEvent" und übergibt dabei das erzeugte Objekt die Informationen von sich selbst mit und ruft die Entsprechende Methode der Listener-Schnittstellen auf und übergibt dabei das ActionEvent-Objekt als Parameter mit.

Oder? :oops: Korrigiert mich bitte jemand, wenn das nicht stimmt.

Ich habe natürlich auch erstmal gegoogelt und im Forum danach gesucht, aber leider nichts passendes gefunden.

Mit freundlichen Grüßen

Memo1990
 

irgendjemand

Top Contributor
Wenn ich das so richtig verstanden habe, erzeugt jede GUI-Komponente, z.B. ein Button, Menüeintrag, etc. ein Objekt der Klasse "ActionEvent" ...

nee ... da muss ich dich enttäuschen ... das ist so nicht ganz richtig ...

es ist zwar richtig das viele gui-components in der lage sind ActionEvents auszulösen ... allerdings nicht alle ... und es gibt auch noch mehr Events als dieses eine

zum allgemeinen ablauf

die VM lässt den sog. EDT laufen ...
dieser ist für das abfangen der events zuständig ...

alles andere muss dann von dort aus in seperaten threads ausgeführt werden um die GUI nicht zu freezen ...

bist also auf dem guten weg ... aber ganz so stimmt es halt dann doch noch nicht ...
 

memo1990

Aktives Mitglied
Das heißt, das EDT (Event Dispatch Thread) läuft immer automatisch im Hintergrund und wenn ein Ereignis eintritt, fängt das EDT es ab und ruft die Entsprechende Listener-Schnittstelle auf. Je nachdem was es für ein Ereignis war. Dann erzeugt auch das EDT, wenn nicht von der GUI-Komponente schon erzeugt, ein ActionEvent-Objekt.

Weil was ich nicht verstehe bzw. was ich wissen möchte ist, wer/was erzeugt eine Instanz der Klasse ActionEvent und wer/was ruft die Entsprechende Listener-Schnittstelle auf? ???:L
 

ESCS

Mitglied
Weil was ich nicht verstehe bzw. was ich wissen möchte ist, wer/was erzeugt eine Instanz der Klasse ActionEvent und wer/was ruft die Entsprechende Listener-Schnittstelle auf? ???:L

Soweit ich das in Erinnerung hab werden Instanzen von ActionEvent vom nativen Teil Javas erzeugt. Diese werden der aktuellen EventQueue via EventQueue.postEvent(AWTEvent theEvent) hinzugefügt. Im EventDispatchThread läuft eine Dauerschleife, die Events aus dieser Queue entnimmt und verteilt (-> zuerst an das entsprechende Objekt (z.B. Instanz von JFrame) und dann optional und je nach Klasse an die registrierten Listener).
 

irgendjemand

Top Contributor
Soweit ich das in Erinnerung hab werden Instanzen von ActionEvent vom nativen Teil Javas erzeugt. Diese werden der aktuellen EventQueue via EventQueue.postEvent(AWTEvent theEvent) hinzugefügt. Im EventDispatchThread läuft eine Dauerschleife, die Events aus dieser Queue entnimmt und verteilt (-> zuerst an das entsprechende Objekt (z.B. Instanz von JFrame) und dann optional und je nach Klasse an die registrierten Listener).

jop ... besser hätte man es eigentlich nicht sagen können

@TO
die Event's selbst werden im native-teil der VM "erzeugt" und dann via JNI an die EDT-eventqueue übergeben ...

der EDT ist im prinzip nichts anderes als ein dauer-loop thread der eben diese queue abarbeitet und dann das event an alle an der component registrierten listener verteilt ... ganz gleich ob dies nun ein ActionEvent oder ein anderes Event ist ...

das ganze zu erklären ist nun mal etwas schwieriger weil man dazu die komplette VM so weit auseinander nehmen müsste bis man an dem punkt ist wo das OS die "events" an die VM übergibt
dann müsste man weiter an die stelle wo dann aus den entsprechenden "events" instanzen erzeugt werden ...
dann gehts noch über JNI weiter *JNI und JNA sind nicht nur dazu da um native code aus java-klassen aufzurufen ... das ganze geht auch umgekehrt*
letztendlich müsste man sich dann mit dem ganzen event-system befassen und was im hintergrund so abläuft

ich versuch dir das mal anhand eines Buttons zu erklären

wenn du mit deiner maus auf den button klickst ... dann erzeugst du damit im OS eine art MouseEvent
dieses MouseEvent wird dann vom OS mit weiteren informationen an die VM weiter gereicht
die VM entschlüsselt die informationen die sie vom OS bekommt um damit etwas halbwegs sinnvolles anfangen zu können ... in der regel sind infos wie "welcher typ (maus , tastatur , etc)" , "welches element (button , textfield , etc)" , "welcher event-code (z.b. bei nem maus-event : welche position ... bei ner tastatureingabe : welche taste)" und einiges anderes wichtig
jedoch passiert das nicht nur auf GUI ebene ... sondern z.b. auch wenn ein netzwerk-paket eintrifft welches für deine anwendung gedacht ist ...
du merkst ... alleine hier wird es schon sehr komplex ... aber zurück zum button
nach dem die VM also nun ein für sie verständliches "event" erzeugt hat *nach dem motto : maus-klick auf den button an position x:y* wird dieses in ein java-objekt gepackt und via JNI vom native code an das event-system weitergegeben
das event system prüft nun welche listener des entsprechenden typs *in diesem fall ein MouseEvent* an die jeweilige component *den button* gehängt wurden und reicht an diese sequentiell mit einem foreach dieses event weiter ...
im button wird nun auf dieses MouseEvent damit reagiert das einmal die klick-animation dargestellt wird *hier ist also auch noch eine manipulation der GUI zu erledigen* und zum anderen wird das entsprechende ActionEvent dadurch instanziert und ausgelöst ...

nun gibt es zwei mögliche implementierungen ... von denen ich erlich gesagt nicht weis welche die aktuell verwendete ist da dies auch von VM zu VM unterschiedlich ist

die wohl "einfache" variante wäre das das gerade erzeugte ActionEvent in die eventqueue geschrieben und dann vom EDT ausgeführt wird ... *das ist denke ich mal die gängige praxis*

eine andere *vermutlich nicht verwendete variante* wäre allerdings das das actionevent nicht dem EDT überlassen wird ... sondern von der implementierung des MouseEvents selbst dierekt weitergegeben wird
der fehler hierbei ist offensichtlich : man ist immer noch im STACK des MouseEvents ... sollte also dem prinzip des event-systems nach NICHT verwendet werden ... *wäre aber wie gesagt auch eine möglichkeit*

wie das ActionEvent nun weiterverarbeitet wird ist hier erstmal eher egal .. da es beides dann zu folgendem führt :
alle dem button hinzugefügten actionlistener werden nun wieder sequentiell mit diesem actionevent versorgt

und nun kommt noch das problem des multi-threadings hinzu : da der EDT in der regel für das abfangen der input-events zuständig ist ... aber auch für die entsprechende manipulation der GUI ... wäre es fatal hier eine aktion einzureihen welche längere zeit braucht ...
denn in dieser zeit in der die zeitaufwändige operation läuft wird der EDT blockiert ... er kann also keine weiteren events abarbeiten weil er noch damit beschäftigt ist das Mouse/Key/ActionEvent auszuführen

auf grund dessen sollte man ALLE aktionen in einen eigenen thread auslagern ...
in der regel trifft das eher auf zeitaufwändige I/O-ops zu ... aber kann sich schon als leichtes "ruckeln" bemerkbar machen wenn doch mal die eine oder andere aktion einen tick länger dauert als vom programmierer gedacht

das ganze thema event-handling ist schon recht komplex und sehr plattformabhängig ... da es hier auf die konkrete implementierung der VM ankommt

ich kenne zwar "Jetzt lerne ich Java7" nicht ... aber in "Java ist auch eine Insel" findest du über genau dieses thema eine ganze menge
um dich zu erleichtern : die "Java-Insel" ist als sog. OpenBook dierekt im netz verfügbar und kann dort ohne bezahlung gelesen werden

einfach mal google nach "Java ist auch eine Insel" fragen ... gleich der erste treffer sollte es sein

kapitel 14 der aktuellen ausgabe sollte das sein was du suchst

Galileo Computing :: Java ist auch eine Insel - 14 Einführung in grafische Oberflächen
 

memo1990

Aktives Mitglied
Wow ... schon recht komplex, das ist wahr. Danke für eure Beiträge. Nebenbei muss ich noch sagen super Forum hier. :toll:

@irgendjemand
Das das kenne ich von Galileo Computing <openbook>.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben