Einen schönen guten Abend 
Für mein Spiel welches ich zur Zeit in Java programmiere habe ich nun angefangen meine komplett eigene GUI zu programmieren (Von Grund auf!).
Nun an sich nimmt das ganze von Tag zu Tag immer mehr Form an, aber ich bin nun schon seit geraumer Zeit im Bereich der MouseMotion Event's und stoße immer wieder auf dasselbe Problem:
Das MouseMotion Event soll nur für die untereste / oberste (je nachdem wie man es sieht) aufgerufen werden. Wenn ich also einen Container A habe, auf diesem sich ein Container B befindet und auf B ein Button dann sollen die MouseMotion Events, wenn ich mich mit der Maus über den Button bewege, nur für den Button aufgerufen werden und nicht für Container A und Container B (Denn die Bounds der Container A und B liegen auch im Bereich der Maus).
Programmierung im Überblick (Kurzfassung)
Nun nochmal zu meinem Problem:
Hier nochmal mein bisheriger Code:
Ich hoffe jemand versteht mein Anliegen und kann mir einen Tipp geben
Edit: Manchmal ... öfters kommt es vor, das ich hier was schreibe nachdem ich stundenlang nach einer Lösung suche und ungefährt 5 Minuten später fällt mir eine super einfache Lösung ein.
Einfach von Beginn an eine Methode schreiben welche die unterste Komponente ermittelt... ich probiere das ganze nun aus und gebe noch Rückmeldung... xD
Für mein Spiel welches ich zur Zeit in Java programmiere habe ich nun angefangen meine komplett eigene GUI zu programmieren (Von Grund auf!).
Nun an sich nimmt das ganze von Tag zu Tag immer mehr Form an, aber ich bin nun schon seit geraumer Zeit im Bereich der MouseMotion Event's und stoße immer wieder auf dasselbe Problem:
Das MouseMotion Event soll nur für die untereste / oberste (je nachdem wie man es sieht) aufgerufen werden. Wenn ich also einen Container A habe, auf diesem sich ein Container B befindet und auf B ein Button dann sollen die MouseMotion Events, wenn ich mich mit der Maus über den Button bewege, nur für den Button aufgerufen werden und nicht für Container A und Container B (Denn die Bounds der Container A und B liegen auch im Bereich der Maus).
Programmierung im Überblick (Kurzfassung)
- Aufruf von handleMouseMotion im Spielezyklus (max. 60* pro Sekunde) mit dem obersten Container (Screen).
- Um das Event "MouseExited" zu erkennen, speichere ich mir die letzte Komponente in welcher ein MouseMotionEvent ausgelöst wurde ab. Wenn diese null ist (zu Beginn des Spiels) wird diese direkt auf den Screen gesetzt um NullPointer abzufangen.
- MouseMotion Event nur dann auslösen wenn die letzte Mausposition ungleich der jetzigen ist.
- Ist die linke Maustaste gedrückt? Löse das MouseDragged Event für die letzte Komponente aus > Ende! || Andernfalls fahre mit Schritt 5 fort.
- Befindet sich die Mausposition innerhalb der Bounds der Komponente? Weiter, ansonsten Abbruch!
- Wenn sich die Bounds der letzten Komponente außerhalb der jetzigen befinden, dann loese fuer die letzte Komponente das Event "MouseExited" aus.
- Wenn sich die letzte Mausposition außerhalb der Bounds der aktuellen Komponente befindet, dann loese fuer die aktuelle Komponente das Event "MouseEntered" aus.
- Event ausloesen: MouseMoved fuer aktuelle Komponente
- Letzte Komponente auf aktuelle Komponente setzen.
- handleMouseMotion fuer jede weiter Unterkomponente aufrufen (Fuer Container!).
Nun nochmal zu meinem Problem:
- MouseMoved soll nur bei der untersten Komponente ausgeführt werden.
- MouseExited soll ebenfalls aufgerufen wenn sich die Maus auf einer Komponente innerhalb der vorherigen Komponente befindet (Im obigen Beispiel, wenn ich mit der Maus ueber den Button gehe, soll MouseExited fuer Container B ausgelöst werden.
Hier nochmal mein bisheriger Code:
Java:
/**
* MouseMotion Event Erkennung.
* @param component Komponente welche geprueft werden soll.
* @param delta Zeit vergangen seit letztem Aufruf (in ms).
* @param mouseX Mausposition Pixel X-Achse (Links: 0).
* @param mouseY Mausposition Pixel Y-Achse (Oben: 0).
* @param glX Bereits umgerechnete Mauspotion im OpenGL Koordinatensystem X - Achse (Links: -1, Rechts: +1).
* @param glY Bereits umgerechnete Mauspotion im OpenGL Koordinatensystem Y - Achse (Oben: +1, Unten: -1).
*/
private void handleMouseMotion(Component component, float delta, float mouseX, float mouseY, float glX, float glY) {
if (this.cmpMouseMotion == null){
this.cmpMouseMotion = component;
}
// MouseMotion Events koennen nur dann auftreten
// wenn sich die Maus bewegt
if (mouseX != this.lastMouseX && mouseY != this.lastMouseY) {
MouseMotionEvent mmEventComponent = new MouseMotionEvent(component, delta, mouseX, mouseY);
MouseMotionEvent mmEventComponentLast = new MouseMotionEvent(this.cmpMouseMotion, delta, mouseX, mouseY);
MouseMotionListener[] mmListenerComponent = component.getMouseMotionListeners();
MouseMotionListener[] mmListenerComponentLast = this.cmpMouseMotion.getMouseMotionListeners();
// Pruefung auf Linksklick, wodurch ein MouseDragged Event
// auf der bestehenden letzten Componente durchgefuehrt wird
if (Mouse.isButtonDown(0)){
if (mmListenerComponentLast != null){
for(MouseMotionListener mml : mmListenerComponentLast){
mml.mouseDragged(mmEventComponentLast);
}
}
}else{
// Befindet sich die Maus in der uebergebenen Componente?
if (component.getBounds().inGlBounds(glX, glY)){
// Wenn sich die letzte Componente außerhalb der aktuellen
// Mausposition befindet, dann loese fuer diese Componente
// das Event "MouseExited" auf.
if (!this.cmpMouseMotion.getBounds().inGlBounds(glX, glY)){
// Eventausloeser: MouseExited bei der letzten Componente
if (mmListenerComponentLast != null){
for(MouseMotionListener mml : mmListenerComponentLast){
mml.mouseExited(mmEventComponentLast);
}
}
}
// Wenn die letzte Mausposition außerhalb der Bounds der
// uebergebenen Componente war, dann loese fuer diese
// Componente das Event "MouseEntered" auf.
if (!component.getBounds().inGlBounds(this.lastMousePosGlX, this.lastMousePosGlY)){
if (mmListenerComponent != null){
for (MouseMotionListener mml : mmListenerComponent){
System.out.println("Enter");
mml.mouseEntered(mmEventComponent);
}
}
}
// Eventausloeser: MouseMoved bei der uebergebenen Componente
if (mmListenerComponent != null){
for (MouseMotionListener mml : mmListenerComponent){
mml.mouseMoved(mmEventComponent);
}
}
// Die uebergebene Componente ist nun die letzte
this.cmpMouseMotion = component;
if (component.getComponents() != null){
// Pruefe weiter fuer Unterkomponenten
for (Component subComponent : component.getComponents()) {
handleMouseMotion(subComponent, delta, mouseX, mouseY, glX, glY);
}
}
}
}
}
}
Ich hoffe jemand versteht mein Anliegen und kann mir einen Tipp geben
Edit: Manchmal ... öfters kommt es vor, das ich hier was schreibe nachdem ich stundenlang nach einer Lösung suche und ungefährt 5 Minuten später fällt mir eine super einfache Lösung ein.
Einfach von Beginn an eine Methode schreiben welche die unterste Komponente ermittelt... ich probiere das ganze nun aus und gebe noch Rückmeldung... xD
Zuletzt bearbeitet: