Mouselistener

Status
Nicht offen für weitere Antworten.

Dog86

Gesperrter Benutzer
Hallo,

ich habe folgenden COde

Java:
package test;

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

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

public class test{
	
	static JLabel jLabel = null;
	public static void init()
	{
		System.out.println("init");
		jLabel = new JLabel("Test");
		jLabel.setBounds(10, 10, 20, 20);
	}
	public static void main(String[] args){
    
	JFrame frame = new JFrame();	
	
	frame.setSize(200,200);
	frame.setLayout(null);
	if(jLabel == null)
		init();
	
	
	jLabel.addMouseMotionListener(new MouseMotionListener() {
		
		public void mouseMoved(MouseEvent e) {
			
			
		}

		public void mouseDragged(MouseEvent e) {	
			jLabel.setBounds(e.getX(),e.getY(), 20, 20);
			jLabel.repaint();
		}
	});
	
	frame.add(jLabel);
	jLabel.setVisible(true);
	frame.setVisible(true);
  }
}

Ich will dieses JLabel also mit der Maus verschieben können, das haut so weit auch hin. Mein Problem ist aber, dass die ganze Sache irgendwie wild umherspringt..

Das ganze soll am Ende quasi eine Art verschieben von Elementen werden..doch woher kommt das wilde springen?

Wäre nett wenn mir jmd. eben mal helfen könnte.
 
e.getX()/ e.getY() liefert dir die Position der Maus relativ zum Label,
Bounds hat aber mit der Position des Labels im umgebenen JFrame/ JPanel zu tun

da musst du dir im Detail anschauen was passiert,
das Label ist anfangs auf Bounds 10,10,
die Maus ist im Label z.B. an Position 15, 15 (entspräche im Panel 25,25)

die erste Bewegung führt zu Listener getX/Y 15, 15 -> setBounds 15,15, das ist gleich ein Sprung von 5 Pixeln,

bei der nächsten Bewegung liefert der Listener getX/Y 10,10, denn die Maus hat sich ja kaum bewegt, höchstens um 1 Pixel,
das Label ist aber inzwischen ganz wo anders (um 5 Pixel verschoben worden),
jedenfalls führt das wieder zu setBounds 10,10, Sprung zurück,

wird die Maus weit weg bewegt, kann man das auch alles im Detail nachvollziehen,
besserer Code sieht so aus:
Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        X.main(null);
    }

}


class X
{
    static JLabel l = null;
    static int lX;
    static int lY;

    public static void init()
    {
        System.out.println("init");
        l = new JLabel("Test");
        l.setBackground(Color.YELLOW);
        l.setOpaque(true);
        l.setBounds(10, 10, 30, 30);
    }

    public static void main(String[] args)
    {

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setLayout(null);
        if (l == null) init();

        l.addMouseListener(new MouseAdapter()
            {

                public void mousePressed(MouseEvent e)
                {
                    lX = e.getX();
                    lY = e.getY();
                }

            });
        l.addMouseMotionListener(new MouseMotionAdapter()
            {

                public void mouseDragged(MouseEvent e)
                {
                    Rectangle r = l.getBounds();
                    l.setBounds(r.x + e.getX() - lX, r.y + e.getY() - lY, 30, 30);
                    l.repaint();
                }
            });

        frame.add(l);
        frame.setVisible(true);
    }

}
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Zurück
Oben