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:
in MouseDragged:
1. Position des Mauszeigers innerhalb des Programmfensters abfragen
2. Dann davon d abziehen und dahin das verschiebbare Panel setzen.
Vielen Dank!
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:
- 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?
- 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:- Position des Zeigers innerhalb des zu verschiebenden Panels abfragen.
- 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();
}
}
});
}
}