MouseMotionListener stotterhafte Ausführung

BlubBlub

Bekanntes Mitglied
Hi,

ich habe ein JRootPane erstellt.
In diesem JRootPane befindet sich beispielsweise ein Bild.
Man soll das JRootPane in seiner Größer durch ziehen mit der Maus verändern können.

Unten ist ein kleiner Codeabschnitt meines Programms zu sehen.
Ich habe mir das GlassPane des JRootPane geholt und an dieses den MouseMotionListener registriert.

Wenn ich das Pane nach rechts dragge dann funktioniert alles wunderbar.
Wenn ich das Pane nach oben versuche zu draggen, so wir das Aufziehen nur sehr stotterhaft
ausgeführt und der Mauszeiger eilte irgendwann dem Pane voraus.

Eigentlich müsste der MousMotionListener nach jeder Pixebewegung aufgerufen werden,
so dass
diffX = me.getX()-lastX;
diffY = me.getY()-lastY;
die Werte -1, 0 oder +1 annehmen. Dem ist aber auch nicht so.


Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;


public class TestRootPaneMouseMotionListener implements MouseMotionListener
{
	private TestRootPane rootPane;
	private Component glassPane;
	private int caseHandle;
	private int thick;
	private int lastX;
	private int lastY;
	private int diffX;
	private int diffY;
	private Rectangle handleN;
	private Rectangle handleE;
	private Cursor cursorN;
	private Cursor cursorE;
	private Cursor cursorMOVE;
	private String actualCursor;
	
	public TestRootPaneMouseMotionListener(TestRootPane rootPane)
	{
		this.rootPane = rootPane;
		this.glassPane = rootPane.getGlassPane();
		this.thick = 14;	
		
		this.handleN = new Rectangle(rootPane.getWidth()/2-thick/2, 0, thick, thick);
		this.handleE = new Rectangle(rootPane.getWidth()-thick, rootPane.getHeight()/2-thick/2, thick, thick);
	
		actualCursor = "";
		cursorN = new Cursor(Cursor.N_RESIZE_CURSOR);
		cursorE = new Cursor(Cursor.E_RESIZE_CURSOR);
		cursorMOVE = new Cursor(Cursor.MOVE_CURSOR);
	}

	@Override
	public void mouseDragged(MouseEvent me) 
	{
		if(!rootPane.getStartedDragFlag())
		{	
			lastX = me.getX();
			lastY = me.getY();
			
			if(handleN.contains(me.getPoint()))
			{
				caseHandle = 0;
			}
			else if(handleE.contains(me.getPoint()))
			{
				caseHandle = 3;
			}
			else caseHandle = 8;
		}
		else
		{		
			diffX = me.getX()-lastX;
			diffY = me.getY()-lastY;
			lastX = me.getX(); 
			lastY = me.getY();
			
			if( ((rootPane.getWidth()+diffX) > 14) && ((rootPane.getHeight()+diffY) > 14) )
			{
				switch(caseHandle)
				{
					case 0://North
						rootPane.setBounds(rootPane.getX(), rootPane.getY()+diffY, rootPane.getWidth(), rootPane.getHeight()-diffY);
						break;	
						
					case 3://East
						rootPane.setBounds(rootPane.getX(), rootPane.getY(), rootPane.getWidth()+diffX, rootPane.getHeight());
						break;
				}	
				handleN.setLocation(rootPane.getWidth()/2-thick/2, 0);
				handleE.setLocation(rootPane.getWidth()-thick, rootPane.getHeight()/2-thick/2);
				rootPane.validate();
			}
		}	
	}

	
	@Override
	public void mouseMoved(MouseEvent me)
	{				
		if(handleN.contains(me.getPoint()))
		{
			if(!actualCursor.equals("cursorN"))
			{
				glassPane.setCursor(cursorN);
				actualCursor = "cursorN";
			}
		}	
		else if(handleE.contains(me.getPoint()))
		{
			if(!actualCursor.equals("cursorE"))
			{
				glassPane.setCursor(cursorE);
				actualCursor = "cursorE";
			}
		}
		else 
		{
			if(!actualCursor.equals("cursorMOVE"))
			{
				glassPane.setCursor(cursorMOVE);
				actualCursor = "cursorMOVE";
			}
		}	
	}
}
 

Michael...

Top Contributor
Hab mir den Code nicht im Detail angeschaut, würde aber sagen es hängt daran wie Du die neuen Bounds ermittelst.

Ich würde dem ganzen noch einen MouseListener spendieren.
- bei mousePressed speicherst Du die aktuellen Bounds der Komponente und die Position des Mousezeigers
- in der mouseDragged ermittest Du dann immer das Delta zwischen mousePosBeiClick und aktueller Mouseposition und berechnest abhängig von der Zugrichtung immer auf Basis der ursprünglichen Bounds die neue Position und Lage der Komponente
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Arif Swing MouseMotionListener liefert falsche Werte ? AWT, Swing, JavaFX & SWT 7
L JComponent und MouseMotionListener AWT, Swing, JavaFX & SWT 2
M mouseDragged im MouseMotionListener AWT, Swing, JavaFX & SWT 1
javampir MouseMotionListener rechte Maustaste AWT, Swing, JavaFX & SWT 4
D Swing Objekte bewegen mit MouseMotionListener AWT, Swing, JavaFX & SWT 4
C MouseMotionListener AWT, Swing, JavaFX & SWT 5
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
M MouseListener/MouseMotionListener AWT, Swing, JavaFX & SWT 2
F AWT MouseMotionListener e.getButton() ist immer 0 unter Linux und Windows AWT, Swing, JavaFX & SWT 6
T MouseMotionListener außerhalb von Frame AWT, Swing, JavaFX & SWT 3
S MouseMotionListener AWT, Swing, JavaFX & SWT 7
J mouseDragged und MouseMotionListener AWT, Swing, JavaFX & SWT 3
M MouseMotionListener oder mouseListener AWT, Swing, JavaFX & SWT 6
J Problem mit eigener Titelleiste und MouseMotionListener AWT, Swing, JavaFX & SWT 2
H MouseMotionListener#mouseDragged() in großen Abständen AWT, Swing, JavaFX & SWT 7
M Java, Swing: MouseMotionListener AWT, Swing, JavaFX & SWT 19
F MouseMotionListener und Parameter? AWT, Swing, JavaFX & SWT 4
B MouseMotionListener zu träge? AWT, Swing, JavaFX & SWT 3
L MouseMotionListener AWT, Swing, JavaFX & SWT 2
N "globaler" MouseListener (+MouseMotionListener) AWT, Swing, JavaFX & SWT 4
K MouseMotionListener zu lahm? AWT, Swing, JavaFX & SWT 3
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
T Javafx Ausführung AWT, Swing, JavaFX & SWT 7
I Fataler Error bei GUI-Ausführung AWT, Swing, JavaFX & SWT 3
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
D Swing Bei MenuSelectionManager auf Ausführung warten? AWT, Swing, JavaFX & SWT 5
C JFileChooser hängt bei Ausführung mit Terminal AWT, Swing, JavaFX & SWT 2
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
A Swing Vokabeltrainer zeigt in einfacher Ausführung nichts an AWT, Swing, JavaFX & SWT 5
B Problem bei JAR Ausführung AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
X Applet Java Applet Datei Ausführung AWT, Swing, JavaFX & SWT 9
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
D Mehrfach ausführung der GUI AWT, Swing, JavaFX & SWT 5
O Doppelte Ausführung von KeyPressed AWT, Swing, JavaFX & SWT 7
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R doppelte Ausführung bei einfachem Mausklick! AWT, Swing, JavaFX & SWT 12
G Problem mit zeitlicher Ausführung AWT, Swing, JavaFX & SWT 4
E mehrere repaint() Aufrufe - NUR eine Ausführung. Warum? AWT, Swing, JavaFX & SWT 59
F polygon object "stirbt" vor Ausführung in paint() AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben