MouseEvents an Container weiterleiten

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,
ich habe das Problem mit der Ereignissweiterleitung von einer Component zu einem JScrollPane, welches für alle Elemente weiter Ereignisse bereit hält.
Dabei bekomme ich aber immer eine Fehlermeldung und der Debugger springt immer zurück in die Ereignissteuerung meiner Component!
Da mein Code ein wenig ist probiere ich mal die wichtigesten Sachen hier zu posten:

Code:
// Große Klasse mit allen GUI-Elementen mit Eclipse und einem Plugin zusammengeklickt!
private JScrollPane getEditorBereich() {
		if (EditorBereich == null) {
			EditorBereich = new JScrollPane();
			EditorBereich.setPreferredSize(new Dimension(400, 300));		
			EditorBereich.setBackground(new Color(238, 238, 238));    
			EditorBereich.setViewportView(getZeichenBereich());            //Normales JPanel
    
			EditorBereich.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
			                    // mache irgendwas
                                                                }
			});

			EditorBereich.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
				public void mouseMoved(java.awt.event.MouseEvent e) {
					setCursorPosition(e.getX(), e.getY());       
                                                                                 //Ändert die Beschriftung eines JLabels 
				}
			});
		}
		return EditorBereich;
}

//Jetzt lege ich auf das JPanel, welches im ViewPort der JScrollPane liegt eine Grafik, diese soll aber trotzdem  
//das mouseMoved weitergeben und das MouseClicked Ereignis, denn auf dem JScrollPane sollen allgemeine
//sachen passieren, die von den vielen individuellen Objekten, welche in dem JPanel existieren können 
//sozusagen die Erweiterung darstellen!

//Hier ein Auszug aus einem Objekt in kurzer Form:
public class Element extends JLabel implements MouseMotionListener, MouseListener{
// ganzen Implementierungen...
	public void mouseClicked(MouseEvent e){
                       //mache was für dieses Element
                    redispatchMouseEvent(e);
	}

                public void mouseMoved(MouseEvent e){
                    redispatchMouseEvent(e);
                }

                //Weiterleitung
                private void redispatchMouseEvent(MouseEvent e) {
                    Point spritePoint = e.getPoint();
                    //Da ich die Struktur nicht ändere:
                    //Parent  = JPanel -> ViewPort -> JScrollPane
                    //vllt gibts dafür ne elegantere Lösung!
                    Container container = parent.getParent().getParent(); 
                    Point containerPoint = SwingUtilities.convertPoint(this, spritePoint, container);
                    this.dispatchEvent(new MouseEvent(container, e.getID(), e.getWhen(), e.getModifiers(),     
                                                containerPoint.x, containerPoint.y, e.getClickCount(), e.isPopupTrigger()));
    }
}
Ich sehe meinen Fehler nicht und bin um jede Hilfe dankbar!
Achso, die Fehlermeldung bei sieht immer so aus:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
	at sun.awt.windows.WComponentPeer.getLocationOnScreen(Native Method)
	at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
	at java.awt.Component.getLocationOnScreen(Unknown Source)
	at javax.swing.SwingUtilities.convertPointToScreen(Unknown Source)
	at javax.swing.SwingUtilities.convertPoint(Unknown Source)
	at SpriteOriginalElement.redispatchMouseEvent(Element.java:73)
	at SpriteOriginalElement.mouseClicked(Element.java:50)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
 
Code:
public void mouseClicked(MouseEvent e){
    //mache was für dieses Element
    redispatchMouseEvent(e);
}

private void redispatchMouseEvent(MouseEvent e)  {
    ...
    this.dispatchEvent(new MouseEvent(container, e.getID(), e.getWhen(), e.getModifiers(),
Beim ersten Überfliegen sieht das aus, als ob du den NEUEN Event auf die Component weiterdispatchst, auf der der ALTE empfangen wurde - für den NEUEN wird dann wieder ein neuer dispatcht ... usw....
 
Ja so in etwa sagt es auch der Debugger, das ich immer und immer wieder in das Gleiche Event reinspringe!
Aber was habe ich falsch gemacht und wie kann ich das ändern?
Ich versuche mich zum ersten Mal an Swingoberflächen und finde diese relativ kompliziert an manchen stellen.
Hast du evt. einen Lösungsvorlschag für mich?!

Gruss
 
Hat denn keiner von euch einen Lösungsvorschlag oder weiß was ich falsch mache?
 
Ich mach's immer so:
Code:
container.dispatchEvent(e);
(Das heisst, du ersetzt einfach "this.dispatchEvent.." durch "container.dispatchEvent.." :wink: )
 
Vielen Dank für deine Antwort, ich werde es gleich Montag ausprobieren, wenn ich wieder bei meinem Quellcode bin :wink:
Aber nur für mein Verständniss: Wieso muss ich this durch container ersetzen?
Ich habe es so verstanden, dass von dem Objekt, von dem es aufgerufen wird, eine weiterleitung über die Methode dispatchEvent geschieht, indem die Zielkomponente ein neues Event bekommt und der erste Parameter angibt an welches Objekt das ganze gesendet werden soll!
Aber anscheinend habe ich da was fehlverstanden, wie kann ich mir den diesen Mechanismus vorstellen?!
 
in java.awt.Component: Dispatches an event to this component or one of its sub components.

Vielleicht ist das ja der Grund, dass er das Event nich nach oben reichen kann an die Scrollview (denke mal das die Scrollview keine Subcomponent deines Elements ist)?? Bin leider in dem Code dieser Methode nich ganz durchgestiegen auf die Schnelle, aber vielleicht kann mich ja einer in meinen Gedanken bestätigen 😀
 
Eigentlich sollte es so sein, die der Aufbau ist folgender:
JLabel wird abgelegt ind JPanel dieser wiederum ist der JViewPort des JScrollPane und danch kommt dann noch das Panel des Frames und dann das Frame. Somit sollte doch dann JScrollPane ein Subelemnt von JLabel sein oder nicht?!
Wenn ich allerdings wie nach dem unten stehenden Zitat, mir das ganze angucke ist schon klar warum es eine "Endlosschleife" geworden ist.
Liefert das Event e über einen Aufruf von dispatchEventImpl() an diese Komponente.

Deshalb denke ich habe ich da nur einen Gedankenfehler im Umgang mit der Methode gehabt.
Denn ich hole mir ja durch parent().parent() den JScrollPane nur gebe ich diesem nicht das gewünschte Event sondern mir selber 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben