mit Maus verschiebbares Panel

blz

Bekanntes Mitglied
Hallo,
ich habe mich durchs Internet gewurstet und auch einige Beispiele gefunden, bei denen man Panels mit der Maus verschieben kann.
Allein - sie funktionieren nicht ganz oder ich verstehe sie nicht ganz.
Ich habe mir daraus nun selbst ein Minimalbeispiel (mit zunächst nur einem Panel) gebastelt, das in groben Zügen funktioniert.
Ich hätte dazu aber einige Fragen:

  1. Meine Idee wäre, einfach dem panel, das ich verschieben will, einen MouseListener hinzuzufügen. Es klappt aber nur, wenn ich auch noch einen MousemotionListener hinzufüge. Warum?
  2. Irgendetwas scheint bei der Berechnung der Position des Mauszeigers nicht zu passen. Ich habe diese Berechnungen auch nur deshalb so, weil sie in fast allen Beispielen, die ich gefunden habe, so waren. Ich kann sie aber nicht ganz nachvollziehn, v. a. nicht, warum immer mit getxonscreen() gearbeitet wird. So wie ich diese Methode verstehe, liefert sie einen Wert von der linken oberen Ecke des Bildschirms aus. Aber dann dürfte doch diese Berechnung nicht mehr klappen, wenn ich das Fenster verschiebe?
    Meine Idee wäre:
    In Mousepressed:
    1. Position des Zeigers innerhalb des zu verschiebenden Panels abfragen.
    2. Position des Panels innerhalb des Programmfensters abfragen.
      --> Abstand d vom Mauszeiger zu der Ecke links oben des verschiebbaren Panels ausrechnen

in MouseDragged:
1. Position des Mauszeigers innerhalb des Programmfensters abfragen
2. Dann davon d abziehen und dahin das verschiebbare Panel setzen.

Vielen Dank!

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

class FrameWithMoveables extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private MyPanel actPanel;   
    private MouseHandler mh = new MouseHandler();

    public FrameWithMoveables() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 500, 500);
        setResizable(false);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        setContentPane(contentPane);       

        MyPanel panel = new MyPanel(new Point2D.Float(60, 100), new Dimension(70, 70), Color.RED);
        panel.addMouseListener(new MouseHandler());
        panel.addMouseMotionListener(mh);
    }

    private class MouseHandler extends MouseAdapter {
        int dx;
        int dy;
        
        @Override
        public void mouseDragged(MouseEvent arg0) {           
            if (arg0.getComponent() == actPanel) {
                actPanel.setLocation((arg0.getXOnScreen() - dx), (arg0.getYOnScreen() - dy));               
            }
        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            actPanel = (MyPanel) arg0.getSource();           
            dx = arg0.getXOnScreen() - actPanel.getX();
            System.out.println(arg0.getXOnScreen());
            System.out.println(actPanel.getX());
            System.out.println(dx);
            dy = arg0.getYOnScreen() - actPanel.getY();
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {           
            dx=0;
            dy=0;
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
        }
    }
    

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameWithMoveables frame = new FrameWithMoveables();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
 

blz

Bekanntes Mitglied
Eine Frage habe ich mittlerweile selbst lösen können, dank dieser hervorragenden Erklärung:
https://javabeginners.de/Ereignisbehandlung/Mausereignisse.php

Ich muss den MouseListener hinzufünge für z. B. die Methode mousePressed,
den MouseMotionListener für z. B. die Methode mouseDragged

Da derMouseAdapter beide Interfaces implementiert, ist nur das eine Objekt nötig (also sinnlos oben, ich könnte immer mh hinzufügen), es sind aber beide Hinzufügungen (einmal als MotionListener, einmal als MouseListener) nötig.
Schönes Klassendiagramm:
http://www.scalingbits.com/java/javakurs2/swing/adapter
 

blz

Bekanntes Mitglied
Erfreut stelle ich nun fest, dass sich dadurch auch das Problem der Mauszeigerposition erledigt hat :)
Dann scheint die Berechnung zu stimmen.
Also scheint getXOnScreen() nicht die Position auf dem gesamten Bildschirm auszugeben (so habe ich es wohl fälschlich aus der api herausgelesen), sondern nur die Position innerhalb des aktuellen Programms.
Denn dann stimmt die Berechnung mit meinem obigen Vorschlag überein.

Ein Problem bleibt:
Das Panel wird bei schneller Bewegung immer ein bisschen gestaucht ... Woran kann das liegen?
Hier noch einmal der vollständige Code:

Java:
package blah_mit_Randerkennung2;


import java.awt.Color;

import java.awt.Dimension;
import java.awt.EventQueue;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

class FrameWithMoveables extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private MyPanel actPanel;   
    private MyMouseAdapter mh = new MyMouseAdapter();

    public FrameWithMoveables() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 500, 500);
        setResizable(false);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        setContentPane(contentPane);       

        MyPanel panel = new MyPanel(new Point2D.Float(60, 100), new Dimension(60, 60), Color.PINK);
        panel.addMouseListener(mh);
        panel.addMouseMotionListener(mh);

//        MyPanel panel1 = new MyPanel(new Point2D.Float(120, 150), new Dimension(60, 60), Color.RED);
//        panel1.addMouseListener(new MouseHandler());
//        panel1.addMouseMotionListener(mh);
//
//        MyPanel panel2 = new MyPanel(new Point2D.Float(200, 250), new Dimension(60, 60), Color.blue);
//        panel2.addMouseListener(new MouseHandler());
//        panel2.addMouseMotionListener(mh);

//        contentPane.addMouseListener(mh);
//        contentPane.addMouseMotionListener(mh);
          contentPane.add(panel);
//        contentPane.add(panel1);
//        contentPane.add(panel2);
    }

    private class MyMouseAdapter extends MouseAdapter {
        int dx;
        int dy;
        
        @Override
        public void mouseDragged(MouseEvent arg0) {           
            if (arg0.getComponent() == actPanel) {
                actPanel.setLocation((arg0.getXOnScreen() - dx), (arg0.getYOnScreen() - dy));               
            }
        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            actPanel = (MyPanel) arg0.getSource(); 
            // Differenz aus der x-Mauszeigerposition innerhalb des Programmfensters und der x-Position des zu verschiebenen Panels
            // --> Ergibt die x-Entfernung des Mauszeigers von der linken oberen Ecke des Panels
            dx = arg0.getXOnScreen() - actPanel.getX();
            System.out.println(arg0.getXOnScreen());
            System.out.println(actPanel.getX());
            System.out.println(dx);
            // analog
            dy = arg0.getYOnScreen() - actPanel.getY();
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {           
            dx=0;
            dy=0;
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
        }
    }
    

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    FrameWithMoveables frame = new FrameWithMoveables();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Linie mit der Maus auswählen AWT, Swing, JavaFX & SWT 5
B mit maus Objekt bewegen AWT, Swing, JavaFX & SWT 3
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
C JTextField Inhalt mit Maus selektieren wenn disabled AWT, Swing, JavaFX & SWT 2
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
A JFrame Größenänderung mit Maus und GridLayout AWT, Swing, JavaFX & SWT 10
J Maus "locken" für Menü AWT, Swing, JavaFX & SWT 8
D Grafiken an Maus anhängen AWT, Swing, JavaFX & SWT 2
P Pfeilpolygon per Maus rotierbar machen - Kleine Schwierigkeiten AWT, Swing, JavaFX & SWT 29
P Event Handling Gedrückte Maus Blockiert MausEvents AWT, Swing, JavaFX & SWT 2
R Swing Per Maus JLabel resizen AWT, Swing, JavaFX & SWT 6
F Maus von alleine bewegen! AWT, Swing, JavaFX & SWT 8
G Swing JPanel per Maus verschieben AWT, Swing, JavaFX & SWT 5
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
C AWT Mausbarriere Maus fangen AWT, Swing, JavaFX & SWT 10
J "Auswahlfenster" mit Maus auf JLabel zeichnen AWT, Swing, JavaFX & SWT 4
W Swing Bild zeichnen wenn Maus an bestimmter Position ist AWT, Swing, JavaFX & SWT 4
J Inaktivität von Maus und Tastatur AWT, Swing, JavaFX & SWT 4
G AWT Images aus Imagearray an die Maus pappen und bewegen AWT, Swing, JavaFX & SWT 4
F Element anzeigen / erstellen. Maus vs Controller AWT, Swing, JavaFX & SWT 7
M 3D-Grafik Bewegung mit der Maus ohne Klicken AWT, Swing, JavaFX & SWT 10
F Swing Objekte mit Maus verschieben AWT, Swing, JavaFX & SWT 8
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
Y AWT Maus Koordinaten abspeichern in eine Textfile AWT, Swing, JavaFX & SWT 3
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
J maus festlegen AWT, Swing, JavaFX & SWT 6
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
T Swing JComboBox: Listeneinträge mit der Maus verschieben AWT, Swing, JavaFX & SWT 5
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
W Swing Maus Rastersprung AWT, Swing, JavaFX & SWT 3
S Swing JTable Auswahl mehrerer Zellen mit STRG+Maus AWT, Swing, JavaFX & SWT 3
E Hilfetext anzeigen beim Überfahren mit der Maus AWT, Swing, JavaFX & SWT 3
G Maus über Button AWT, Swing, JavaFX & SWT 3
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
G Listenelemente mit der Maus verschieben AWT, Swing, JavaFX & SWT 4
B kein MouseEvent bei zu schneller Bewegung der Maus AWT, Swing, JavaFX & SWT 7
B JTable - Wechsel der Spalte bei TAB, RETURN oder Maus AWT, Swing, JavaFX & SWT 5
D Mit der Maus in verschiedene Modi wechseln AWT, Swing, JavaFX & SWT 15
Z Buttons erscheinen erst wenn man mit der Maus drüber geht AWT, Swing, JavaFX & SWT 7
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
M Kreis mit gedrückter Maus bewegen AWT, Swing, JavaFX & SWT 20
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
R Einstellen der Maus Rad Geschwindigkeit beim Scrollen AWT, Swing, JavaFX & SWT 3
G Kreis zeichnen und mit Maus ziehen AWT, Swing, JavaFX & SWT 3
W Maus Rahmen zeichnen AWT, Swing, JavaFX & SWT 10
A JFileChooser - Mehrere Dateien per Maus markieren (nokeys) AWT, Swing, JavaFX & SWT 7
V JTable Handling Fokus on Keystroke und Maus Doubleclick AWT, Swing, JavaFX & SWT 9
R JTable: Maus-Click ohne Datensätze AWT, Swing, JavaFX & SWT 9
L Größe von Komponenten im Nulllayout mit der Maus verändern. AWT, Swing, JavaFX & SWT 2
J Context Menü Maus AWT, Swing, JavaFX & SWT 3
G JTable selektion der Zeile bei Fokusieren mit der Maus AWT, Swing, JavaFX & SWT 5
T mousemoved abfrage - aber welches event wenn maus weg? AWT, Swing, JavaFX & SWT 2
lin Frame bei Drücken eines Buttons mit Maus verschieben AWT, Swing, JavaFX & SWT 7
G [AWT] Zeichnungen per Maus auswählen AWT, Swing, JavaFX & SWT 8
D Ne Maus Event Frage AWT, Swing, JavaFX & SWT 4
D Polygon mit der Maus zeichnen AWT, Swing, JavaFX & SWT 2
M Zusätzlichen Maus-Klick erzeugen AWT, Swing, JavaFX & SWT 4
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
P Verschiebbares Layout mit SWT AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben