Glasspane und dispatchen von Events

Status
Nicht offen für weitere Antworten.

Mrb2002

Neues Mitglied
Hi alle,

ich habe ein kleines Problem mit dem dispatchen von Events.
In einem JFrame habe das Glasspane durch ein JPanel ersetzt. Diesem Panel wurden 3 MouseListener geadded.
MouseMotionListener, MouseWheelListener , MouseListener

Damit fängt das Glasspane alle MouseEvents ab. Es wurden alle Methoden der Listener überschrieben um Komponenten auf dem GlassPane selektieren zu können.
Es gibt aber Situationen bei denen ich die MouseEvents an Komponenten unter dem Glasspane weiterleite. Was auch funktioniert. (Hier der Code zum dispatchen der events)

Code:
private void redispatchMouseEvent(MouseEvent e, boolean repaint)
	{
		Point glassPanePoint = e.getPoint();
		Container container = content;

		Point containerPoint = SwingUtilities.convertPoint(this,
				glassPanePoint, content);
		if (false)
		{ //we're not in the content pane
			//Could have special code to handle mouse events over
			//the menu bar or non-system window decorations, such as
			//the ones provided by the Java look and feel.
		} else
		{
			//The mouse event is probably over the content pane.
			//Find out exactly which component it's over.
			Component component = SwingUtilities.getDeepestComponentAt(
					container, containerPoint.x, containerPoint.y);
			//System.out.println("component" + component.toString());

			if (component != null)
			{
				Point componentPoint = SwingUtilities.convertPoint(this,
						glassPanePoint, component);
				//System.out.println(componentPoint.getX() + " "
					//	+ componentPoint.getY());
				component
						.dispatchEvent(new MouseEvent(component, e.getID(), e
								.getWhen(), e.getModifiers(), componentPoint.x,
								componentPoint.y, e.getClickCount(), e
										.isPopupTrigger()));
			}
		}

	}

Allerdings habe ich damit ein Problem beim draggen.
Wenn ich z.B. eine Scrollbar bewegen möchte und mit der Maus aus den Grenzen der Scrollbar komme bleibt die Scrollbar stehen. (die Grenzen sind die Bounds der Scrollbar) Sobald man wieder innerhalb der Grenzen ist bewegt sich die Scrollbar wieder.
Jetzt mein Problem. Wie kann ich dem entgegen wirken. Also das normale verhalten wieder erreichen.

Danke schon mal im Voraus

mfg

Michael Rehberg
 
D

DrZoidberg

Gast
Mit SwingUtilities.convertMouseEvent kannst du deinen Code noch etwas weiter verkürzen.

Du leitest wahrscheinlich nicht sämtliche MouseEvents korrekt weiter. Deshalb funktioniert nicht alles.

Wie wärs mit nem anderen Ansatz. Du benutzt gar keine Glasspane. Statt dessen nimmst du

java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(my_awteventListener, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);

Damit bekommst du dann alle Mouse Events, ohne dass du die weiterleiten musst, denn die Events werden trotzdem noch automatisch an die Componenten geliefert. Du fängst damit also keine Events ab sondern beobachtest sie nur.
 

Mrb2002

Neues Mitglied
Hi Danke für deine Antwort!

Das Problem dabei besteht darin, dass ich die Events auf dem Glasspane aber benötige.
Die Gui soll ungefähr das machen und aussehen:

links und rechts befindet sich ein JTree in der Mitte ein JPanel.
So jetzt nehme ich einen Node aus dem eine Tree und droppe ihn auf dem anderen Tree.
In dem Moment soll eine Linie gezeichnet werden die über alle Komponenten zeichnet.
Diese Linie soll selektierbar und beweglich sein.

Deswegen das Glasspane mit den Mouselistenern.

Vielleicht hast du ja noch einen anderen Tipp.

Übrigens werden doch alle Events weitergeleitet. Allerdings denke ich dass das Draggen daran scheitert, das man ausserhalb der Bounds einer Komponente ja eine mouse exited bzw entered event erhält und dabei dann nicht mehr die richtigen koordinaten hat..

Aber ich komme noch net ganz dahinter..

Mal sehen

mfg

Mrb2002
 
B

Beni

Gast
Ich hatte mal ein ähnliches Problem, und hat es gelöst, indem ich einfach jeder Component automatisch einen MouseListener hinzufüge/entferne.

Das GlassPane bleibt weiterhin da, aber es besitzt einfach keine MouseListener, und kann deshalb nichts verschwinden lassen.

Code:
public class Listener implements ContainerListener, MouseListener{
		private boolean pressed;
		private boolean sending = false;
		
		/** Defaultkonstruktor */
		public Listener(){
		}
		
		public void componentAdded(ContainerEvent e) {
			add ( e.getChild() );
		}

		public void componentRemoved(ContainerEvent e) {
			remove ( e.getChild() );
		}

		private void send( MouseEvent e ){
			Component src = (Component)e.getSource();
			
			if( src.getMouseListeners().length == 1 ){
				try{
					Component parent = src;
					src.removeMouseListener( this );
					sending = true;
				
					while( !e.isConsumed() && parent != null && parent != InteractivePanel.this ){
						parent.dispatchEvent( e );
						e.translatePoint( parent.getX(), parent.getY() );
						parent = parent.getParent();
					}
				}
				finally{
					src.addMouseListener( this );
					sending = false;
				}
			}
			
		}
		
		public void mousePressed(MouseEvent e) {
			if( sending )
				return;
			
			send( e );
			
			pressed = true;
			[...]
		}
		
		public void mouseReleased ( MouseEvent e ){
			if( sending )
				return;
			
			if ( pressed ){
				pressed = false;
				[...]
			}
			
			send( e );
		}		
		
		public void mouseClicked(MouseEvent e) {
			if( !sending )
				send( e ); 
		}
		public void mouseEntered(MouseEvent e) {
			if( !sending )
				send( e );
		}
		public void mouseExited(MouseEvent e) {
			if( !sending )
				send( e );
		}
		
		public void add ( Component c ){	
			c.addMouseListener( this );
			
			if ( c instanceof Container ){
				Container cont = (Container)c;
				cont.addContainerListener( this );
				
				for ( int i = 0, n = cont.getComponentCount(); i < n; i++ )
					add ( cont.getComponent( i ) );
			}
		}
		public void remove ( Component c ){
			c.removeMouseListener( this );
			
			if ( c instanceof Container ){
				Container cont = (Container)c;
				cont.removeContainerListener( this );
				
				for ( int i = 0, n = cont.getComponentCount(); i < n; i++ )
					remove ( cont.getComponent( i ) );
			}
		}
 
D

DrZoidberg

Gast
Mrb2002 hat gesagt.:
links und rechts befindet sich ein JTree in der Mitte ein JPanel.
So jetzt nehme ich einen Node aus dem eine Tree und droppe ihn auf dem anderen Tree.
In dem Moment soll eine Linie gezeichnet werden die über alle Komponenten zeichnet.
Diese Linie soll selektierbar und beweglich sein.

Das geht doch aber problemlos mit der Methode, die ich vorgeschlagen habe.

Muss die Linie wirklich auch über die JTrees gezeichnet werden? Reicht nicht das JPanel.
Oder reicht es zumindest, wenn die Linie nur innerhalb des JPanels anklickbar ist? Dann könnte man sich den Aufwand sparen.


Übrigens werden doch alle Events weitergeleitet. Allerdings denke ich dass das Draggen daran scheitert, das man ausserhalb der Bounds einer Komponente ja eine mouse exited bzw entered event erhält und dabei dann nicht mehr die richtigen koordinaten hat..

Leitest du die MOUSE_EXITED und MOUSE_ENTERED Events nun weiter oder nicht? Weiterleiten ist da ja der falsche Ausdruck. Du musst diese Events manuell erzeugen.
Bei MOUSE_DRAGGED musst du beim Weiterleiten natürlich aufpassen.
Solange die Maustaste gedrückt bleibt, muss der MouseEvent an die selbe Komponente geleitet werden, auf der zuvor die Maustaste runter gedrückt wurde. Auch wenn der Mauszeiger sich dann über einer anderen Komponente befindet.

@Beni: Bei deiner Methode wird der Event doch auch abgefangen und weitergeleitet genauso wie bei Mrb2002. Der Code dürfte sich daher genauso verhalten.
 
B

Beni

Gast
Nicht ganz, die Events kommen direkt zu der richtigen Component, und werden dort abgehört.
Also Mouse-exited etc... wird richtig weitergeleitet. Eine Spezialbehandlung für MouseDragged, ... muss nicht noch extra geschrieben werden.

Das weiterleiten wird nur benötigt, da in Swing Events durch eine Component hindurchfallen können, sollte kein Listener gesetzt sein. (Sobald ein Event in Swing verarbeitet wurde, wird der boolean "consumed" auf false gesetzt, und das Event bleibt stecken.)

Ich hab das Ding jetzt schon ein Zeitchen getestet, es funktioniert ziemlich gut.

mfg Beni
 
G

Guest

Gast
Hallo an alle,

Bei MOUSE_DRAGGED musst du beim Weiterleiten natürlich aufpassen.
Solange die Maustaste gedrückt bleibt, muss der MouseEvent an die selbe Komponente geleitet werden, auf der zuvor die Maustaste runter gedrückt wurde. Auch wenn der Mauszeiger sich dann über einer anderen Komponente befindet.


darin lag das Problem! Hab es jetzt genau so gelöst!
Danke nochmal für eure Hilfe.

mfg

Mrb2002
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing Durch GlassPane auf Button klicken und ActionEvent auslösen AWT, Swing, JavaFX & SWT 0
D GlassPane für JPanel AWT, Swing, JavaFX & SWT 2
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
B GlassPane setVisible(true) funktioniert nicht AWT, Swing, JavaFX & SWT 2
M JComboBox auf GlassPane-Panel AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
F GlassPane deaktiviert MouseKlicks nicht AWT, Swing, JavaFX & SWT 6
hdi Swing GUI Sperren mit GlassPane AWT, Swing, JavaFX & SWT 7
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
G Probleme mit Glasspane AWT, Swing, JavaFX & SWT 4
J Glasspane Demo von Sun hat Probleme - wie fix ich die? AWT, Swing, JavaFX & SWT 10
A GlassPane wird zu spät angezeigt AWT, Swing, JavaFX & SWT 2
G JDialog hinter Glasspane von JFrame. Geht das? AWT, Swing, JavaFX & SWT 3
TheJavaKid GlassPane AWT, Swing, JavaFX & SWT 5
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
C Frage zur GlassPane AWT, Swing, JavaFX & SWT 33
G Probleme mit GlassPane AWT, Swing, JavaFX & SWT 3
L GlassPane ein und abschalten AWT, Swing, JavaFX & SWT 3
J GlassPane - an Menupunkte herankommen AWT, Swing, JavaFX & SWT 2
M Problem mit GlassPane AWT, Swing, JavaFX & SWT 4
I GlassPane AWT, Swing, JavaFX & SWT 8
G mouse events AWT, Swing, JavaFX & SWT 6
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
D Swing Events vom JLayer abfangen AWT, Swing, JavaFX & SWT 2
D Transparentes Hauptfenster Events AWT, Swing, JavaFX & SWT 1
M Swing Hinter die Kulissen von Events (addActionListener) AWT, Swing, JavaFX & SWT 6
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
S Mouse Events in einer sortierten JTable unterscheiden AWT, Swing, JavaFX & SWT 18
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
J Events und Sleep? AWT, Swing, JavaFX & SWT 4
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
N Variablen in Events AWT, Swing, JavaFX & SWT 4
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
L Swing Auslöser eines Events finden? AWT, Swing, JavaFX & SWT 6
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
0 Events werden nicht ausgelöst AWT, Swing, JavaFX & SWT 2
V Swing Auslösen von zwei Events hintereinander AWT, Swing, JavaFX & SWT 4
T Swing Control und Events AWT, Swing, JavaFX & SWT 8
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
R Events - Nur auf eines reagieren AWT, Swing, JavaFX & SWT 3
T JComboBox: ActionListener/ItemListener wie nur auf bestimmte Events reagieren? AWT, Swing, JavaFX & SWT 7
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
T SWT - Table Events AWT, Swing, JavaFX & SWT 3
hdi Events nicht plattform-unabhängig? AWT, Swing, JavaFX & SWT 14
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
G Reihenfolge von Events AWT, Swing, JavaFX & SWT 4
D Events bei Tabs in einem Editor AWT, Swing, JavaFX & SWT 2
F Probleme mit MouseWheel events in SWT AWT, Swing, JavaFX & SWT 13
M Globale Events in Windows abfangen AWT, Swing, JavaFX & SWT 2
T Hilfe zu Events? AWT, Swing, JavaFX & SWT 6
S Events abfangen, nicht durchlassen AWT, Swing, JavaFX & SWT 2
T Events unterdrücken AWT, Swing, JavaFX & SWT 8
G An die Quelle einen events kommen AWT, Swing, JavaFX & SWT 2
M Problem mit verschachtelten Events und kein ausweg in sicht AWT, Swing, JavaFX & SWT 3
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5
V Events an untere Layers weitergeben AWT, Swing, JavaFX & SWT 2
V events skippen AWT, Swing, JavaFX & SWT 14
M Events auslagern? AWT, Swing, JavaFX & SWT 6
F Events AWT, Swing, JavaFX & SWT 8
N SWT: GUI Windows Events AWT, Swing, JavaFX & SWT 8
I Globale Tastatur-Events abfragen AWT, Swing, JavaFX & SWT 3
D Events werden zu oft aufgerufen AWT, Swing, JavaFX & SWT 4
G Events AWT, Swing, JavaFX & SWT 2
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
S Events fremdauslösen AWT, Swing, JavaFX & SWT 17
K Doppelte Events AWT, Swing, JavaFX & SWT 4
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
D Events, Listener, GUI . Größeres Projekt AWT, Swing, JavaFX & SWT 4
A Vielschichtige GUI und Events? AWT, Swing, JavaFX & SWT 4
V JList mit Events Steuern ? AWT, Swing, JavaFX & SWT 15
S Rechner zu schnell für Events? AWT, Swing, JavaFX & SWT 14
G JTable und Events AWT, Swing, JavaFX & SWT 4
S Events bei 2 gleichen Jtree abfangen AWT, Swing, JavaFX & SWT 3
ShapeShifter JButton erzeugt zwei Events AWT, Swing, JavaFX & SWT 4
B Eigenes Events AWT, Swing, JavaFX & SWT 3
T JScrollPane-Events AWT, Swing, JavaFX & SWT 2
M JTable und Events AWT, Swing, JavaFX & SWT 4
K JComboBox: Endlosschleife durch Events AWT, Swing, JavaFX & SWT 4
K [JComboBox] ENTER löst zwei events aus? AWT, Swing, JavaFX & SWT 2
H Events manuell aufrufen AWT, Swing, JavaFX & SWT 4
F JComboBox setEditable( true ) auf Tastatur Events reagieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben