MouseEvents an Container weiterleiten

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)
 

Marco13

Top Contributor
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....
 
G

Gast

Gast
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
 
G

Gast

Gast
Hat denn keiner von euch einen Lösungsvorschlag oder weiß was ich falsch mache?
 

André Uhres

Top Contributor
Ich mach's immer so:
Code:
container.dispatchEvent(e);
(Das heisst, du ersetzt einfach "this.dispatchEvent.." durch "container.dispatchEvent.." :wink: )
 
G

Gast

Gast
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?!
 

diggaa1984

Top Contributor
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 :D
 
G

Gast

Gast
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
V Swing MouseEvents bei gestapelten Panels AWT, Swing, JavaFX & SWT 2
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
H mouseevents im JTree AWT, Swing, JavaFX & SWT 2
G MouseEvents AWT, Swing, JavaFX & SWT 4
I MouseEvents gehen verloren AWT, Swing, JavaFX & SWT 4
G JPopMenu und MouseEvents AWT, Swing, JavaFX & SWT 4
B Heavyweight Popup lässt keine MouseEvents durch AWT, Swing, JavaFX & SWT 2
K MouseEvents für JTextField ausschalten AWT, Swing, JavaFX & SWT 9
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
G Neue Komponente erstellen - Fragen/Probleme mit MouseEvents AWT, Swing, JavaFX & SWT 2
A MouseEvents im Frame? AWT, Swing, JavaFX & SWT 2
K MouseEvents vor den Components abfangen? AWT, Swing, JavaFX & SWT 4
W MouseEvents mit Parameterübergabe? AWT, Swing, JavaFX & SWT 3
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
W JavaFX Tabelle zeilenweise mit Werten füllen und an Container anpassen AWT, Swing, JavaFX & SWT 23
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
A Swing Externe Klassen aufrufen und in einem bereits vorhandenen Container einfügen AWT, Swing, JavaFX & SWT 0
C Componente in Container (inkl. "Untercontainer") suchen und zurückgeben AWT, Swing, JavaFX & SWT 3
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
Z Swing JPanel soll größer werden als Parent Container (überlappen) AWT, Swing, JavaFX & SWT 5
H Drag-Evente nach Container wechsel AWT, Swing, JavaFX & SWT 2
J Fehlermeldung adding a window to a container AWT, Swing, JavaFX & SWT 9
S JPanel in den Container hinzufügen AWT, Swing, JavaFX & SWT 3
xehpuk Swing Erst Components, dann Container zeichnen AWT, Swing, JavaFX & SWT 2
K Container AWT, Swing, JavaFX & SWT 14
K JFrame-Größe an inneren Container anpassen AWT, Swing, JavaFX & SWT 2
J Swing Container innerhalb eines JPanels erfragen AWT, Swing, JavaFX & SWT 3
W setEnabled in Container Objekten (JScrollPane) AWT, Swing, JavaFX & SWT 5
X Instanzieren und Zuweisen vom BorderLayout an Container nicht notwendig ? AWT, Swing, JavaFX & SWT 4
B JPG in einem Container anzeigen lassen AWT, Swing, JavaFX & SWT 3
S this-Zugriff auf Container höherer Ebene AWT, Swing, JavaFX & SWT 2
P DragAndDrop zw Component und Container AWT, Swing, JavaFX & SWT 4
S SWT Lösen mit Shell, Container oder Group? AWT, Swing, JavaFX & SWT 5
D Container des JFrame zeichnet sich nicht bei Aufruf von paintAll AWT, Swing, JavaFX & SWT 9
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
D Container vor Fullscreen AWT, Swing, JavaFX & SWT 5
R Container Size Problem AWT, Swing, JavaFX & SWT 5
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
I Container AWT, Swing, JavaFX & SWT 6
H Benachrichtigt werden wann ein Container repainted wird? AWT, Swing, JavaFX & SWT 5
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
A MouseEvent auf Container bzw. Frame weiterleiten AWT, Swing, JavaFX & SWT 5
S Mehrere Container AWT, Swing, JavaFX & SWT 10
T Canvas gegen Container austauschen --> GUI fehlt AWT, Swing, JavaFX & SWT 4
M Container in Frame über Button einfügen? AWT, Swing, JavaFX & SWT 4
A Container AWT, Swing, JavaFX & SWT 8
G Durchsichtiger verschiebbarer Container gesucht AWT, Swing, JavaFX & SWT 6
G problem mit anzeigen eines geänderten Container AWT, Swing, JavaFX & SWT 2
S Kann JSP mit BI nicht zum Container hinzufügen AWT, Swing, JavaFX & SWT 7
G hintergrund von JFrame/Container transparent machen AWT, Swing, JavaFX & SWT 2
C JPanel oder Container in JPanel AWT, Swing, JavaFX & SWT 2
X Container aus FocusCycle entfernen AWT, Swing, JavaFX & SWT 2
B Container aus einen andere Klasse hinbekommen ? AWT, Swing, JavaFX & SWT 5
R Component aus Container entfernen bzw. austauschen. AWT, Swing, JavaFX & SWT 6
I Hintergrundbild bei awt container AWT, Swing, JavaFX & SWT 9
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
njans Swing MouseDrag weiterleiten AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
V Swing MouseMotionEvent "nach unten weiterleiten". AWT, Swing, JavaFX & SWT 16
W (Logikfrage) GuiEvents weiterleiten AWT, Swing, JavaFX & SWT 6
M mouseEvent an darunterliegende Komponenten weiterleiten AWT, Swing, JavaFX & SWT 2
P KeyEvent methode an actionEvent methode weiterleiten AWT, Swing, JavaFX & SWT 5
B Exceptions in actionPerformed() weiterleiten AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben