Java, Swing: MouseMotionListener

Status
Nicht offen für weitere Antworten.
M

matthiasS

Gast
Hallo,

habe eine kleine Frage, evtl. könnt ihr mir ja helfen ...
Folgendes habe ich vor: Ich moechte einzelne Fußballspieler (in meinem Fall, Quadrate in paint() gezeichnet [aus JComponent abgeleitet]) auf einem Spielfeld (ebenfalls ein JComponent) platzieren und diese mit der Mouse spaeter verschieben können. Ich sollte dazu sagen - nur zu Lernzwecken. Einen besonderen Sinn hat das alles nicht. :) Folgendes habe ich dazu gemacht. Habe mir auf meine ContentPane ein LayererdPane gelegt, auf der untersten Ebene das Spielfeld und darueber die Spieler platziert. Wie gesagt, die Spieler will ich verschieben koennen. Habe dazu den MouseMotionListener implementiert und an die einzelnen Spieler hinzugefuegt. Meine draggedMouse()-Methode macht nichts anderes als { e.getComponent().setLocation(e.getX(),e.getY()); } e ist das MouseEvent. Dachte, dass dies ausreichen muesste, um die Komponente an meinen Mousezeiger zu binden, allerdings verschiebt sich das Objekt nur sehr unschoen. Es bleibt nicht an der Mouse "kleben" und die Position, auf der es platziert wird, ist mir auch nicht ganz klar ...


Vieleicht habt ihr ja einen Rat ...

Vielen Dank im Voraus
Matthias
 

Wildcard

Top Contributor
In Swing überschreibt man paintComponent, und nicht paint.
Du musst dir erstmal einen Offset ausrechnen. setLocation bezieht sich auf die linke-obere Ecke deiner Component, während der Mauszeiger in der regel irgendwo in der Mitte der Komponente ist.
 
M

matthiasS

Gast
Danke, fuer die rasche Antwort. Habe meine paint-Methode umbenannt. Wenn ich an der Komponente ziehe, hat man immer das gefühl, als wolle sie sich am oberen linken Rand des Fensters festhalten. Die Komponente laesst sich auch nicht "durchgaengig" ziehen - sie verschwindet immer und taucht dann wieder auf. Der MouseZeiger wirkt "schneller", als die Komponente. Vielen Dank im Voraus.

Gruß
Matthias
 

Wildcard

Top Contributor
Ich hab dir doch gesagt das du einen Offset brauchst. Hast du das gemacht? Wenn ja, zeig mal den Code
 
M

matthiasS

Gast
Die Komponente ist 50x30 pixel groß.
Hier meine mouseDragged-Methode:
Code:
public void mouseDragged(MouseEvent e) {
		
		e.getComponent().setLocation(e.getX()-25,e.getY()-15);
	
		System.out.println("ziehe spieler ... ");
	}

in der Klasse, in der ist die Objekte bilde steht folgendes:
Code:
        Spieler blubb = new Spieler();
        blubb.addMouseMotionListener(this);
        blubb.setBounds(60, 170, 50, 30);
...
        layeredPane.add(blubb, new Integer(2), 0);

Dankeschoen!
 

Wildcard

Top Contributor
Nein, so meine ich das nicht.
Bei mousePressed musst du dir den Punkt speichern.
Bei mouseDragged nimmst du dann den neuen Punkt, und errechnest du den Offset, also um wieviel sich die Maus bewegt hat.
Dann bewegst du deine JComponent um diesen Offset
 
M

matthiasS

Gast
Danke.

Habe nun folgendes Problem. An meine JComponent fuege ich zum einen den MouseMotionListener und zum anderen den MouseListener hinzu. Loese ich auf meiner Komponente nun ein mousePressed Event aus, dann bekomme ich die x und y Koordinaten nur in Bezug auf meine Komponente. Sprich, klicke ich links oben bekomme, ich fuer x und y den Wert 0 ... Wenn ich die Komponente nun "dragge" und auf meiner Flaeche ziehe, bekomme ich die Koordinaten immer in Bezug auf mein Fenster ( die werden dann also sehr groß verglichen mit dem pressed-Event), bzw. die Flaeche unterhalb meiner Spieler. Wie soll ich da denn dann den Offset errechnen?

Danke im Voraus,
Matthias
 

Wildcard

Top Contributor
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JComponent;
import javax.swing.JFrame;


public class Drag extends JFrame
{
	
	public Drag()
	{
      setLayout(null);
		add(new Dragable());
	}
	
	public static void main(String[] args)
	{
		Drag drag = new Drag();
		drag.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		drag.setSize(640,480);
		drag.setVisible(true);
	}
	
	class Dragable extends JComponent implements MouseMotionListener
	{
		private Point offset;
		
		public Dragable()
		{
			setSize(50, 50);
			addMouseListener(new MouseAdapter() {
			
				@Override
				public void mousePressed(MouseEvent e)
				{
					offset=e.getPoint();
				}
			});
			addMouseMotionListener(this);
		}

		@Override
		protected void paintComponent(Graphics g)
		{
			g.setColor(Color.BLUE);
			g.fillRect(0, 0, 50, 50);
		}

		public void mouseDragged(MouseEvent e)
		{
			setLocation(getX()+e.getPoint().x-offset.x,getY()+e.getPoint().y-offset.y);
		}

		public void mouseMoved(MouseEvent e)
		{
			// TODO Auto-generated method stub
			
		}		
	}

}
 
M

matthiasS

Gast
Eine Frage haette ich da noch.
Und zwar zu folgender Zeiler:
Code:
setLocation(getX()+e.getPoint().x-offset.x,getY()+e.getPoint().y-offset.y);

e.getPoint().x ist ja die X-Koordinate des MouseZeigers innerhalb der JComponent (also im Intervall in meinem Fall von 0 bis 30 bzw. 50) zum Zeitpunkt des Draggens, richtig? Mein alter Wert - also der Offset zum Zeitpunkt des mousePressed-Events ist nicht großartig vom ersten Wert verschieden. Hoechstens um 1 - 2 Einheiten. Ich verstehe gerade nicht, wieso ich diesen Offset errechnen muss ... wäre super, wenn du mir das nochmal versuchen könntest zu erklären. Stehe gerade etwas auf dem Schlauch, Sorry!
 

Leroy42

Top Contributor
e.getPoint().x - offset.x ist tatsächlich nur minimal, allerdings
nur beim ersten Mal!

Nimm einfach mal die Subtraktionen der offset-Werte heraus und starte
das Programm dann nochmal. Dann wirst du den Unterschied bemerken.
 
M

matthiasS

Gast
die Figuren lassen sich dann nicht mehr bewegen. die differenzen zwischen offset und den werten beim draggen steigen. stehe dennoch auf dem schlauch. :/ kann das nochmal so wiedergeben, dass ich es verstehe ... :/

Danke im Voraus
 

Leroy42

Top Contributor
matthiasS hat gesagt.:
die Figuren lassen sich dann nicht mehr bewegen
Das ist falsch! Ich habe es selbst ausprobiert! :noe:

Wenn du

Code:
setLocation(getX()+e.getPoint().x, getY()+e.getPoint().y);

schreibst, bewegt sich das blaue Rechteckt schon, allerdings springt es
bei der ersten Bewegung so, daß sich seine linke, obere Ecke genau unter dem
Mauszeiger befindet, unabhängig davon wo du es mit der Maus angeklickt hast.
 
M

matthiasS

Gast
Ah ok. Habe bis auf getX() und getY() alles entfernt. Was ich nicht ganz verstehe ist, warum ich nicht einfach alles weglassen kann. Schließlich benoetige ich ja immer nur die neue Position des Mousezeigers mit der JComponent zu synchronisieren.
 

Wildcard

Top Contributor
Dann ziehst du die Komponente aber immer an der linken oberen Ecke, was ich als Benutzer als sehr störend empfinden würde.
Warum machst du's nicht einfach so wie ich dir gezeigt habe?
 

Leroy42

Top Contributor
Wildcard hat gesagt.:
Warum machst du's nicht einfach so wie ich dir gezeigt habe?

Vielleicht weil er zu den Menschen gehört, die den Sachen auf den Grund gehen wollen? :shock:

Was ihn mir im übrigen sympathischer macht als diejenigen, die einfach nur
eine Antwort in ihren Source kopieren und dann, ohne ihn analysiert zu haben,
damit leben! :applaus:
 

Wildcard

Top Contributor
Leroy42 hat gesagt.:
Vielleicht weil er zu den Menschen gehört, die den Sachen auf den Grund gehen wollen? :shock:

Was ihn mir im übrigen sympathischer macht als diejenigen, die einfach nur
eine Antwort in ihren Source kopieren und dann, ohne ihn analysiert zu haben,
damit leben! :applaus:
Da gebe ich dir schon recht, nur gibt es glaube ich nichts weiter zu erklären, da wir das bereits bis zur Erschöpfung getan haben :bae:
 
M

MatthiasS

Gast
Sagte ich ja ... es bewirkt gar nichts.
Aber es ist uebrigens, wie du sagst - ich wuerde es gerne verstehen. Momentan tue ich dies leider nicht ganz. :/
Warum das "Springen" wegfaellt etc.
 

Wildcard

Top Contributor
Setz dir Breakpoints in den entsprechenden Methoden, nimm ein kariertes Blatt mit Koordinatensystem und trag die Werte ein. Vieleicht verstehst du es dann.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
D Java Swing Cache AWT, Swing, JavaFX & SWT 0
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
M Swing Java-Swing-Uebungen AWT, Swing, JavaFX & SWT 6
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
A Java Swing Error AWT, Swing, JavaFX & SWT 3
D Layoutmanager in Java Swing vs. Java AWT AWT, Swing, JavaFX & SWT 3
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
J Swing MVC mit Java Swing, insbesondere die Controller-Struktur AWT, Swing, JavaFX & SWT 4
2 Werde Java GUIs immer noch mit dem in die Jahre gekommen Swing gemacht? AWT, Swing, JavaFX & SWT 12
S [Java+Scala] GUI mit Swing oder JavaFX AWT, Swing, JavaFX & SWT 6
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
T SWF in JAVA [Swing] AWT, Swing, JavaFX & SWT 4
I Java Swing - repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 4
S Beim Aufbau GUI: java.lang.IllegalAccessError in javax.swing AWT, Swing, JavaFX & SWT 6
D Probleme mit Java Swing unter Mac OSX AWT, Swing, JavaFX & SWT 13
M icons für die java.swing components wie jbutton etc AWT, Swing, JavaFX & SWT 5
N Java Swing Event Handling AWT, Swing, JavaFX & SWT 7
S Implementierung Java Swing HelloWorld - verständnisproblem AWT, Swing, JavaFX & SWT 3
oliver1974 Compiz-Fusion und Java/Swing. Hölle. AWT, Swing, JavaFX & SWT 6
C Architekturfrage Java Swing (MVC) AWT, Swing, JavaFX & SWT 3
M Java mit Swing - Elemente erst nach klick sichtbar AWT, Swing, JavaFX & SWT 13
A video-datei in java abspielen (SWING) AWT, Swing, JavaFX & SWT 8
Z Bei Problem mit Java Swing brauche dringende Hilfe AWT, Swing, JavaFX & SWT 3
N Swing startet nicht - java.lang.NoSuchMethodError: main AWT, Swing, JavaFX & SWT 8
L swing und java applet.keine Konflikt ,oder? AWT, Swing, JavaFX & SWT 3
P bmp in java-swing darstewllen AWT, Swing, JavaFX & SWT 2
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben