Hallo
Ich möchte, dass ein Component per Maus herum gezogen werden kann:
public void mouseMoved(MouseEvent me){
if(zahnrad_dragged){
draggedZahnrad.setPos(new Point(
me.getX()-draggedZahnrad.breite/2,me.getY()-draggedZahnrad.höhe/2));
revalidate();
draggedZahnrad.revalidate();
repaint();
}
}```
zahnrad_dragged wird in mousePressed auf true und in mouseReleased auf false gesetzt
Die Methode setPos setzt die Bounds des Components.
Das Problem ist:
Es ruckelt ohne Ende, teilweise "teleportiert" sich der Component über einige hundert Pixel umher
Nur ein Lösungsvorschlag kann nicht versprechen das es funktioniert. Du machst sehr viele Anfragen bei MouseMove und er muss natürlich entsprechend oft neu zeichnen. Bau um das If einen Timer, wenn die Maus irgendwie 10 milisekunden nicht bewegt worden ist führt du das if aus.
Habe mal so etwas änliches gebaut in GWT (kannst du so nicht verwenden musst du umbauen natürlich
scrollTimer = new Timer() {
@Override
public void run() {
fitToContent();
}
};
}
scrollTimer.cancel();
scrollTimer.schedule(UPDATE_DELAY);
oder verschiebe keine Komponenten!,
was ist das für eine Komponente, nur einfache graphische Anzeige eines Bildes oder einer paintComponent-Zeichnung?
dann wäre es möglich, die gesamte Fläche unter Kontrolle eines JPanels zu stellen, mir Mauskoordinaten zu arbeiten,
berechnen was unter der Maus sein sollte, dieses Element passend verschieben, also neue Koordinaten,
und repaint() immer noch, malt die Komponente X an anderer Stelle,
dragged auch beteiligt
edit: nahezu kein Swing-Thema gehört in Java Basics, und das hier ist auch kein besonders einfaches, verschoben,
bei Gelegenheit ruhig darauf achten
Ja, natürlich kann man es so machen, dass man einfach ein Bild an eine Stelle im Mainpanel malt und die Position verändert.Aber ein bekannter von mir der auch Java programmiert sagte mir, dass es mit Components erstens weniger ruckelt(hat sich nicht bestätigt) und zweitens es eleganter ist.
hoffentlich wird nicht das Bild erst noch jedes Mal neu geladen? (bzw. hoffentlich schon bisher, dann wäre noch Potential zur Verbesserung)
etwas Beispielcode einer ruckligen Variante wäre nach so vielen Postings ganz nett
Auch wenn der bisher gepostete Code nicht mal annhähernd reicht, um das Problem zu erkennen oder zu beheben, deutet die Symptomatik darauf hin, dass der MouseListener, der die Component verschieben soll, an der Component selbst hängt. Das würde das ruckeln und springen erklären: In dem Moment, wo die Component verschoben wird, ist die Maus (bezogen auf die Component) schlagartig ganz woanders.
Mehr Code wäre in jedem Fall hilfreich, aber Components draggen ist schon ein bißchen Tricky. Eine GlassPane könnte helfen…
naja, es gibt am Anfang schon evtl. einen ganz schönen Sprung,
egal wo man klickt, das grüne Panel ist danach zentriert unter dem Mauszeiger, (zentriert wegen fester Konstanten 50 zu 100)
um den Standardcode zu ergänzen, kommt dem von IDC wahrscheinlich nahe:
public class Test2
{
static int x;
static int y;
public static void main(String[] args)
{
final JFrame f = new JFrame();
f.setSize(800, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content = new JPanel();
content.setLayout(null);
final JPanel p = new JPanel();
p.setBounds(10, 10, 100, 100);
content.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent arg0)
{
p.setLocation(arg0.getX() - x, arg0.getY() - y);
}
});
content.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
x = e.getX()-p.getLocation().x;
y = e.getY()-p.getLocation().y;
}
});
p.setBackground(Color.GREEN);
content.add(p);
f.add(content);
f.setVisible(true);
}
}
damit sollte die Bewegung hinsichtlich Positionen narrensicher sein, maximal noch Probleme beim Zeichnen möglich, wie ich es ursprünglich verstanden hatte,
ein Test auf Klick im Bereich des Panels mit evtl. Ablehnung der Bewegung habe ich hier nicht aufgenommen