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