JPanel springt beim Verschieben immer hin und her

snoopysalive

Mitglied
Hi!

Ich habe in Swing ein JPanel gebaut, welches sich einfach verschieben lassen soll, wenn man darauf die linke Maustaste drückt, hält, die Position ändert und dann wieder los lässt. Also ein Job für den MouseMotionListener und der Methode mouseDragged.

Hier meine Listener-Implementierung:
Java:
addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
        System.err.println(e.getPoint());
        setLocation(e.getPoint());
    }
});

Das Problem besteht jetzt darin, dass beim Verschieben das JPanel ständig hin und her sprint anstatt am Mauszeiger zu "kleben". Die Ausgaben auf dem STDERR zeigt euch, was passiert, wenn ich das JPanel von links nach rechts verschiebe.

Code:
(...)
java.awt.Point[x=82,y=23]
java.awt.Point[x=101,y=100]
java.awt.Point[x=83,y=23]
java.awt.Point[x=102,y=100]
java.awt.Point[x=86,y=23]
java.awt.Point[x=108,y=100]
java.awt.Point[x=95,y=23]
java.awt.Point[x=115,y=100]
(...)

Warum liefert getPoint() nicht die richtigen Cursor-Positionen zurück? Daran liegt es ja schließlich, dass das Panel ständig hin und her springt.

Danke und Gruß,
Matthias
 
Hallo,

das Problem ist wahrscheinlich, dass das MouseEvent nicht die absoluten Koordinaten auf dem Bildschirm angibt, sondern relativ zu dem Objekt, dem du den MouseListener hinzugefügt hast. Es müsste gehen, wenn du e.getLocationOnScreen() statt e.getPoint() benutzt.
 
Klingt gut. Allerdings bietet das MouseEvent keine Methode getLocationOnScreen(), wie mir Eclipse gerade mitteilt (ich sollte vielleicht noch anfügen, dass ich Java 5 auf dem Mac verwende). Ich schau mir mal die API etwas genauer an. Vielleicht gibt es die Methode getLocationOnScreen() ja doch irgendwo. Danke jedenfalls schonmal!
 
Ah, und schon habe ich's herausgefunden: Man muss, bevor mal getPoint() aufruft, erst noch translatePoint aufrufen. In meinem Fall übergebe ich translatePoint() die Koordinaten des Haupfensters. Danach zappelt das JPanel nicht mehr herum. Hier der Code für den erweiterten Listener:

Java:
addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
        e.translatePoint(getX(), getY());
        setLocation(e.getPoint());
    }
});

Danke nochmal!
 
Zurück