Swing Objekte bewegen mit MouseMotionListener

da_roman

Mitglied
Hallo!

Ich hätte eine Frage bzgl. der Methode mouseMoved.
Ich möchte gerne Objekte in einen JPanel mittels Drag and Drop bewegen.
Dazu verwende ich einen MouseMotionListener, der Aufruf erfolgt in der Methode MouseMoved().
Also, die Objekte werden nicht mit mouseDragged() bewegt, sondern durch einfaches Bewegen der Maus.

Die Objekte sollen sich mit der Maus mitbewegen, die Maus kann sich also auch an einen anderen
Ort als die Objekte befinden. Daher berechne ich mir die Differenz zwischen Maus-Koordinaten und Objekten, und setze dann die Werte neu. Meine Implementierung:
Java:
/**
 * @param x coordinate of the mouse
 * @param y coordinate of the mouse
 */
public void move(int x, int y) {
  float diffX, diffY;
  Iterator<Vertex> it = vertices_.iterator();
  while(it.hasNext()) {
    Vertex v = it.next();
    diffX = v.getX()-x;
    diffY = v.getY()-y;
    v.setX(x-diffX);
    v.setY(y-diffY);
      
    // debug out:
    System.out.println("Vertex:"+v.getX()+" "+v.getY());
    System.out.println("Mouse: "+x+" "+y);
    System.out.println("diffX:"+diffX+", diffY:"+diffY);
    System.out.println("--------------------------------");
  }
}

Das funktioniert leider nicht so ganz. Die Objekte springen immer zwischen Maus hin und her
Ein Blick auf die Ausgabe verrät auch was da schief läuft:

Vertex:357.0 451.0
Mouse: 305 312
diffX:-52.0, diffY:-139.0
--------------------------------
Vertex:253.0 171.0
Mouse: 305 311
diffX:52.0, diffY:140.0
--------------------------------
Vertex:357.0 449.0
Mouse: 305 310
diffX:-52.0, diffY:-139.0
--------------------------------
Vertex:253.0 169.0
Mouse: 305 309
diffX:52.0, diffY:140.0
--------------------------------
Vertex:357.0 447.0
Mouse: 305 308
diffX:-52.0, diffY:-139.0
--------------------------------

usw...
Anscheinend wird die Differenz durch zweifachen Aufruf doppelt abgezogen, daher springen die Objekte immer hin und her :/.

Hat jemand eine Idee was ich anders machen könnte?
danke & lg
 

Volvagia

Top Contributor
Meinst du vielleicht so?

Java:
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;

public class Vertex extends JLabel {
	public Vertex() {
		this((String)null);
	}
	public Vertex(String s) {
		super(s);
		
		MouseAdapter adapter = new MouseAdapter() {
			private Point mouseEnteredLoc;
			
			public void mouseEntered(MouseEvent e) {
				mouseEnteredLoc = new Point(e.getX(), e.getY());
			}
			public void mouseMoved(MouseEvent e) {
				setLocation(calcNewCoordinate(getX(), e.getX(), mouseEnteredLoc.x),
						calcNewCoordinate(getY(), e.getY(), mouseEnteredLoc.y));
			}
			private int calcNewCoordinate(int vectorPx, int mousePx, int enteredPx) {
				return(vectorPx + mousePx - enteredPx);
			}
		};
		addMouseListener(adapter);
		addMouseMotionListener(adapter);
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				buildGui();				
			}
		});
	}
	private static void buildGui() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JLayeredPane content = new JLayeredPane();
		
		Vertex vertexA = new Vertex("Test A");
		vertexA.setSize(vertexA.getPreferredSize());
		content.add(vertexA, Integer.valueOf(0));
		
		Vertex vertexB = new Vertex("Test B");
		vertexB.setSize(vertexB.getPreferredSize());
		content.add(vertexB, Integer.valueOf(1));
		
		frame.setContentPane(content);
		frame.setSize(500, 500);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 

da_roman

Mitglied
Zunächst mal danke für die Antwort :),
hmmmmm nicht wirklich, was ich machen möchte ist sowas:
(sry, etwas mehr code als erwartet..)

Main(MotionDemo.java)
Java:
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MotionDemo {
	public static void main(String[] args) {    
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				Canvas c = new Canvas();
				JFrame f = new JFrame("MotionDemo");
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				f.add(c);
				f.pack();
				f.setLocationRelativeTo(null);
				f.setVisible(true);
			}
		});
	}
}


Zeichenfläche(Canvas.java)
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.JPanel;

public class Canvas extends JPanel implements MouseMotionListener{

	private static final long serialVersionUID = 1L;
	LinkedList<Vertex> vertices;
	
	public Canvas() {
		vertices = new LinkedList<Vertex>();
		vertices.add(new Vertex(20,40));
		vertices.add(new Vertex(40,20));
		vertices.add(new Vertex(40,60));
		vertices.add(new Vertex(60,40));
		addMouseMotionListener(this);
		setBackground(Color.white);
		setPreferredSize(new Dimension(500,500));
	}
	
  	public void move(int x, int y) {
  		int diffX, diffY;
  		Iterator<Vertex> it = vertices.iterator();
  		while(it.hasNext()) {
  			Vertex v = it.next();
  			diffX = v.getX()-x;
  			diffY = v.getY()-y;
  			v.updateCoordinates(x-diffX, y-diffY);
    	}
	}

	@Override
	public void mouseDragged(MouseEvent arg0) {
	}
	
	@Override
	public void mouseMoved(MouseEvent e) {
		move(e.getX(), e.getY());
		repaint();
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setXORMode(getBackground());
		Graphics2D g2d = (Graphics2D)g;
		
		Iterator<Vertex> it = vertices.iterator();
		while(it.hasNext()) {
			it.next().draw(g2d);
		}
	}
}

das zu bewegende Objekt(Vertex.java)
Java:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import javax.swing.JLabel;
 
public class Vertex extends JLabel {

	private static final long serialVersionUID = 1L;
	private static final int WIDTH = 6;
	private Ellipse2D ellipse;
	int x;
    int y;
    
    public Vertex(int x, int y) {
    	this.ellipse = new Ellipse2D.Float(x-(WIDTH/2), y-(WIDTH/2), WIDTH, WIDTH);
    	this.x = x;
    	this.y = y;
    }
    public void updateCoordinates(int x, int y) {
    	setX(x);
    	setY(y);
    	this.ellipse.setFrame(x-(WIDTH/2), y-(WIDTH/2), WIDTH, WIDTH);
    }
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public void draw(Graphics2D g) {
		g.setColor(Color.black);
		g.draw(ellipse);
	}
}

Führt man das Programm aus, und bewegt die maus im JPanel sieht man das "hin und her hüpfen" der Objekte. Also der eigentliche Unterschied zwischen unseren 2 Programmen ist dass ich mehrere Objekte ausgehend von einen Punkt aus bewegen möchte, also ein bisschen anders als "drag and drop"
danke und lg
 

Volvagia

Top Contributor
Meinst du so in etwa?
Wollte schon mit dir schimpfen, da ich dachte du vermischt AWT und Swing, und dann war Canvas doch kein Canvas. ;(

Java:
package org.javaforum.daroman;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MotionDemo {
    private static VertexController vertexController;
	
	public static void main(String[] args) {    
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	vertexController = new VertexController();
            	
                final JFrame f = new JFrame("MotionDemo");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new JPanel() {
                	protected void paintComponent(Graphics g) {
                		super.paintComponent(g);
                		vertexController.paintVertexes((Graphics2D) g);
                	}
                });
                f.getContentPane().addMouseMotionListener(new MouseAdapter() {
                	public void mouseMoved(MouseEvent e) {
                		vertexController.mouseLocationChanged(e.getX(), e.getY());
                		f.repaint();
                	}
                	public void mouseDragged(MouseEvent e) {
                		mouseMoved(e);
                	}
				});
                f.setSize(500, 500);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}
Java:
package org.javaforum.daroman;

import java.awt.Graphics2D;
import java.awt.Point;
import java.util.LinkedList;

public class VertexController {
	private static final Point[] VERTEX_MODS = {
		new Point(1, 0),
		new Point(0, 1),
		new Point(-1, 0),
		new Point(0, -1),
	};
	
	private static final int VERTEX_CUROR_DISTANCE = 20;
	
	private LinkedList<Vertex> vertices;
	
	public VertexController() {
        vertices = new LinkedList<Vertex>();
        
        vertices.add(new Vertex(20, 40));
        vertices.add(new Vertex(40, 20));
        vertices.add(new Vertex(40, 60));
        vertices.add(new Vertex(60, 40));
	}
	public void paintVertexes(Graphics2D g) {
		for(Vertex vertex:vertices) {
			vertex.paint(g);
		}
	}
	public void mouseLocationChanged(int x, int y) {
		if(vertices.size() < VERTEX_MODS.length) {
			throw new IllegalStateException("Less vertexes as need");
		}
		
		for(int i = 0, size = VERTEX_MODS.length; i < size; i++) {
			Point mod = VERTEX_MODS[i];
			Vertex vertex = vertices.get(i);
			mouseLocationChanged(x, y, vertex, mod);
		}
	}
	public void mouseLocationChanged(int x, int y, Vertex vertex, Point mod) {
		int hDist = mod.x * VERTEX_CUROR_DISTANCE;
		int vDist = mod.y * VERTEX_CUROR_DISTANCE;
		
		vertex.setLocation(x - vertex.getWidth() - hDist, y - vertex.getHeight() - vDist);
	}
}
Java:
package org.javaforum.daroman;

import java.awt.Color;
import java.awt.Graphics2D;
 
public class Vertex {
    private static final int DEFAULT_WIDTH = 6;
    
    private int x;
    private int y;
    
    private int width;
    private int height;
    
    public Vertex(int x, int y) {
        this.x = x;
        this.y = y;
        
        width = DEFAULT_WIDTH;
        height = DEFAULT_WIDTH;
    }

    public void paint(Graphics2D g) {
        g.setColor(Color.black);
        g.drawOval(x, y, width, height);
    }
    
    
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public void setWidth(int width) {
		this.width = width;
	}
    public int getWidth() {
		return width;
	}
    public void setHeight(int height) {
		this.height = height;
	}
    public void setLocation(int x, int y) {
    	setX(x);
    	setY(y);
	}
    
    public int getHeight() {
		return height;
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Objekte in JPanel bewegen AWT, Swing, JavaFX & SWT 4
M grafische objekte erstellen und bewegen AWT, Swing, JavaFX & SWT 4
W Objekte auf JPanel bewegen??? AWT, Swing, JavaFX & SWT 2
Juelin Objekte refresh AWT, Swing, JavaFX & SWT 3
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
Redeason Objekte in meiner GUI verschieben AWT, Swing, JavaFX & SWT 1
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
J Objekte von 2 GUIs zusammenfassen AWT, Swing, JavaFX & SWT 2
T Swing Objekte in Liste AWT, Swing, JavaFX & SWT 2
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
MaxG. Swing Dynamisch grafische Objekte erzeugen AWT, Swing, JavaFX & SWT 12
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
T Rectangle Transparent und darunter liegende Objekte Bedienbar AWT, Swing, JavaFX & SWT 0
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
Z Möglichkeit mit Listerners die Farbe meiner Objekte zu ändern AWT, Swing, JavaFX & SWT 15
GenerationLost Bilder an bestimmten Platz einfügen/Objekte visualisieren AWT, Swing, JavaFX & SWT 1
I Objekte aus contentPane löschen funktioniert nicht AWT, Swing, JavaFX & SWT 3
C Swing Java Objekte AWT, Swing, JavaFX & SWT 4
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
N Swing Alle Objekte anzeigen auch bei JPanel-Überlappung AWT, Swing, JavaFX & SWT 6
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
M SWT Durchlagen der SWT Objekte mit Tabulator AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
S Swing Kopie eines JPanels inkl. aller objekte darin erstellen AWT, Swing, JavaFX & SWT 5
P Objekte anzeigen und verschieben - wie? AWT, Swing, JavaFX & SWT 6
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
G Objekte in und aus einer JTable laden AWT, Swing, JavaFX & SWT 5
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
propra Objekte auf Zeichenfläche verschieben AWT, Swing, JavaFX & SWT 2
propra 2D-Grafik Beliebig viele Objekte auf einer Zeichenfläche zeichnen AWT, Swing, JavaFX & SWT 15
T JList und Objekte AWT, Swing, JavaFX & SWT 7
E Objekte zu Path2D zusammensetzen AWT, Swing, JavaFX & SWT 2
M verschieben der Objekte in JPanel nur stückchenweise möglich AWT, Swing, JavaFX & SWT 14
4 AWT bestimmte Objekte zeichnen und löschen AWT, Swing, JavaFX & SWT 8
R komplette Objekte in JTable einfügen AWT, Swing, JavaFX & SWT 18
C File-Objekte an JList übergeben und abrufen AWT, Swing, JavaFX & SWT 6
J Objekte aus Defaulttablemodel AWT, Swing, JavaFX & SWT 5
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3
A Swing Dynamisch Objekte erzeugen AWT, Swing, JavaFX & SWT 3
M JGraph Kante ohne Objekte AWT, Swing, JavaFX & SWT 2
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
F Swing Objekte mit Maus verschieben AWT, Swing, JavaFX & SWT 8
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
J SWT 4 Objekte auf einem Composite anordnen AWT, Swing, JavaFX & SWT 5
L SWT Objekte in GC? AWT, Swing, JavaFX & SWT 8
E Swing Objekte werden nicht angezeigt AWT, Swing, JavaFX & SWT 6
J Ansprechen untergeordneter Objekte AWT, Swing, JavaFX & SWT 6
C JTree Einzelne Objekte färben AWT, Swing, JavaFX & SWT 4
Airwolf89 Swing Dynamisch auf Objekte in einer GUI zugreifen AWT, Swing, JavaFX & SWT 10
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
M Objekte weitergeben AWT, Swing, JavaFX & SWT 3
1 Bubble Breaker - Objekte fallen nicht runter AWT, Swing, JavaFX & SWT 3
F "Objekte" mit "Verbindungen" grafisch darstellen AWT, Swing, JavaFX & SWT 4
G Objekte in JComboBox? AWT, Swing, JavaFX & SWT 7
P Speichern und Auswahl gezeichneter Objekte AWT, Swing, JavaFX & SWT 7
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
D DnD ganzer Objekte(Objekt erstellen) AWT, Swing, JavaFX & SWT 2
W 2 Objekte in eine Tabellenzelle? AWT, Swing, JavaFX & SWT 3
L Objekte in Liste oder ähnliches anzeigen AWT, Swing, JavaFX & SWT 3
S JFrame-Klasse soll ein/mehrere Objekte einer JPanel-Klasse-& AWT, Swing, JavaFX & SWT 3
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
O Eigenschaften größerer GUI-Objekte verwalten AWT, Swing, JavaFX & SWT 3
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
G Objekte in SWT List AWT, Swing, JavaFX & SWT 3
D Schriftgrößen aller Objekte ändern AWT, Swing, JavaFX & SWT 19
X Durch DrawLine verschwindet das Fenster und die Objekte AWT, Swing, JavaFX & SWT 13
N [und täglich grüsst das.] Zeichnen -> Objekte verschwinde AWT, Swing, JavaFX & SWT 2
S JList mit DefaultListModel befüllt, wie Objekte selektieren? AWT, Swing, JavaFX & SWT 3
M grafische Objekte mit Listener versehen AWT, Swing, JavaFX & SWT 3
G JTextArea Objekte in einem Array speichern? AWT, Swing, JavaFX & SWT 3
G Aus Arraylist bestimmte Objekte wiedergegeben bekommen? AWT, Swing, JavaFX & SWT 7
M Keine Buttons oder sonstige Objekte in JFrame unter Linux AWT, Swing, JavaFX & SWT 4
L Mehrere Scrollbar objekte miteinander verbinden AWT, Swing, JavaFX & SWT 3
E Swing-Fenster als Objekte im Sinne des OO-Prgrammparadigmas AWT, Swing, JavaFX & SWT 2
B Objekte auf Fenster verschieben. Bewegliche jPanels. AWT, Swing, JavaFX & SWT 5
T Frage zu JTree: Leaf Objekte vergleichen AWT, Swing, JavaFX & SWT 3
G Einzelne Objekte neu zeichnen AWT, Swing, JavaFX & SWT 8
T Objekte in JList AWT, Swing, JavaFX & SWT 4
H JApplet fehler objekte unsichtbar. AWT, Swing, JavaFX & SWT 2
M Image-Objekte in JEditorPane anzeigen? AWT, Swing, JavaFX & SWT 3
F bewegte objekte mit awt AWT, Swing, JavaFX & SWT 2
B Zwei "gleiche" Objekte auf einem Frame platzieren AWT, Swing, JavaFX & SWT 2
F Objekte beliebigen Typs zu JComboBox hinzufügen AWT, Swing, JavaFX & SWT 7
J Anordung der Objekte in der Oberfläche? AWT, Swing, JavaFX & SWT 3
V Objekte "durch" ActionListener zeichnen AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben