Quelle eines MouseEvents...?

FreakyM

Mitglied
Was ist die Quelle eines MouseEvents?

Bekommt ein Fenster das Event und gibt es nach unten oder umgekehrt?

Wie sieht dann die Aufrufkette von JFrame zum Button aus, gibt es da eine doClick(x,y)-Methode oder wie geht das?

Oder bekommt der Button direkt das Event? Aber wie...?
 
Salve

Was ist die Quelle eines MouseEvents?
Die Komponente, die geklickt wird?
http://docs.oracle.com/javase/6/docs/api/java/util/EventObject.html#getSource()

Wie sieht dann die Aufrufkette von JFrame zum Button aus, gibt es da eine doClick(x,y)-Methode oder wie geht das?
http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/AbstractButton.html#doClick()

-> da wird aber der ActionEvent ausgeführt, nicht der MouseEvent... du kannst ein Button übrigends auch über Touch oder Keyboard "klicken" -> ActionListener verwenden.

Gruss
slowy
 
Sorry ich habe es eventuell etwas doof erklärt... :p

Mir ging es eigentlich darum wo die Urquelle des Mouseevents ist...
Der Button bekommt ja auch nur ein Mouseevent und drückt sich dann und leitet dieses Event weiter an die Listener...

Ich weis nicht ob das schon Betriebssystem-Ebene ist... Zumindest meine ich nicht das source-Object was du mir erklären wolltest...
 
Zuletzt bearbeitet:
Ja, das kommt (meistens) vom Betriebssystem bzw. von anderen Programmen außerhalb der Java Virtual Machine.
Die Abfolge funktioniert so: Wenn du mit der Maus irgend wo hin klickst, erhält dein Betriebssystem diese Information, dann wird von irgend einer Software (unter Linux/Unix mit X11: evdev) registriert. Diese Software verallgemeinert verschiedene Hardware und speichert z.B. die Position des Mauszeigers und übergibt diese an den Window Manager (z.B. explorer.exe unter Windows <= XP; gdm unter GNOME, kdm unter KDE), der abhängig von der Position der Fenster das MouseEvent an die jeweilige Anwendung weiter gibt. In Java-Programmen wird diese vom nativen Code in Java-Objekte (MouseEvent) umgewandelt und in die EventQueue des EventDispatchThreads. Dieser arbeitet die Events Stück für Stück ab und ruft EventQueue.dispatchEvent() auf, die das Event abhängig vom Typ an das Ziel des Events weiter gibt. Bei MouseEvents bedeutet das, dass die Methode Component.processAWTEvent() von einem übergeordneten Component ausgeführt wird (möglicherweise dem „höchsten“ in der Hierarchie, d.h. dem Fenster; bin mir aber nicht sicher), der dann anhand von Größe und Position der Componenten und der Position des MouseEvents den Component berechnet, der das Event letztlich verarbeiten soll.
 
...In Java-Programmen wird diese vom nativen Code in Java-Objekte (MouseEvent) umgewandelt und in die EventQueue des EventDispatchThreads. Dieser arbeitet die Events Stück für Stück ab und ruft EventQueue.dispatchEvent() auf, die das Event abhängig vom Typ an das Ziel des Events weiter gibt. Bei MouseEvents bedeutet das, dass die Methode Component.processAWTEvent() von einem übergeordneten Component ausgeführt wird (möglicherweise dem „höchsten“ in der Hierarchie, d.h. dem Fenster; bin mir aber nicht sicher), der dann anhand von Größe und Position der Componenten und der Position des MouseEvents den Component berechnet, der das Event letztlich verarbeiten soll.

Das bedeutet das der Frame oder zumindest eine "hohe" Komponente in der Methode processAWTEvent() mit Hilfe von contains(x,y) oder Ähnlichem checkt wem er ein neues MouseEvent (mit angepassten Koordinaten) weiter reicht... Oder schickt er es direkt an die Komponente, also gleich z.B. an die tiefste Ebene des Baumes?
 
Wenn du Details wissen willst, schau in die JavaDoc zu
Java:
Container.processEvent(AWTEvent)
Component.processEvent(AWTEvent)
. In Eclipse ist dazu vor allem die Type Hierarchy und Call Hierarchy (über das Kontextmenü von Klassen/Methoden erreichbar) hilfreich.
 

Neue Beiträge

Zurück