Verschiebbare Formularfelder

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hi,
ich habe folgendes vor:

Der User soll per Drag&Drop mit der Maus Formularelemente verschieben können. Funktioniert soweit auch gut, nur wird das Textfeld, das ich als Testobjekt benutze, total flackernd und mit größer werdendem Abstand zum Mauscursor dargestellt - was so einfach scheiße aussieht.

Meine Implementierung ist folgende:
Ich melde eine eigene Klasse als MouseMotionListener am TextField an. In der mouseDragged() steht: textfield.setLocation(e.getLocation()), die linke obere Ecke des Textfelds wird also auf den Auslösepunkt des Events geschoben.

Kann mir jemand helfen oder mir ein Tutorial empfehlen, in dem das Verschieben von Bildern, Formularelementen oder ähnlichem beschrieben wird?

mpG
Tobias
 
B

Beni

Gast
Hm, du verschiebst das Koordinatensystem auf das sich die Maus bezieht, das könnte schon Probleme geben.

Es gibt bei den javax.swing.SwingUtilities Methoden um Punkte von einer Component in eine andere umzurechnen. Ich hab gute Erfahrungen gemacht, den Mauspunkt zuerst in irgendeine nicht bewegte Component (oder direkt den Screen) zu schicken, und von dort aus die neue Position zu berechnen (sozusagen für eine "feste Unterlage" sorgen).
 
G

Guest

Gast
@8ull23y3: Danke, aber es handelt sich um Swing-Komponenten, die schon doppelt gepuffert sind.

@Beni: Ich verstehe nicht ganz: Die Location des Textfields ist doch relativ zum JPanel angegeben - und die Location des Events ist relativ zu was? Wie rechne ich denn was um, um für eine "feste Unterlage" zu sorgen?

mpG
Tobias
 
B

Beni

Gast
Die Location des Events ist relativ zum Textfeld. Da du das Textfeld aber verschiebst, ist vielleicht nicht so klar, was jetzt eigentlich gilt.

Versuchs mal mit "SwingUtilities.convertPoint( textFeld, maus, panel )" den Punkt umzurechnen, und dann die neue Position damit zu setzen.

Code:
// Sinngemäs:
textFeld.setLocation( SwingUtilities.convertPoint( textFeld, mouseEvent.getLocation(), panel ));

Ich habe ein Progi geschrieben, bei dem man ein java.awt.Window verschiebt, und rechne dort mit "SwingUtilities.convertToScreen" die Maus zum Bildschirm um, das funktioniert ohne zittern oder flimmern.
 

Nova

Bekanntes Mitglied
Hallo,

Ich habe kürzlich etwas ähnliches gemacht. Ich habe dazu im umgebenden Panel die Methode getMousePosition(true) aufgerufen, diese liefert die Mausposition realtiv zum (feststehenden) Panel auch wenn die Maus sich auf einem Child-Element befindet.
D.h. in der mouseDragged-Methode statt
Code:
textfield.setLocation(e.getLocation())
Code:
textfield.setLocation(panel.getMousePosition(true))


mfg
Christian
 
B

Beni

Gast
Cool, die Methode kannte ich ja überhaupt nicht. :toll:
Christian, die API gibt da ja eine ganze Liste an, wann dass diese Methoe nicht funktionieren soll, hattest du keine Probleme mit null-Rückgabewerten?
 
G

Guest

Gast
Danke, SwingUtilities ist genial. Leider behebt das nicht das Problem, das der Mauszeiger weit vom zu bewegenden Objekt entfernt ist... Weiß hier vielleicht noch jemand Rat?
 

Tobias

Top Contributor
Der relevante Code ist einfach:

Code:
public void mouseDragged(MouseEvent e) {
    textfield.setLocation(SwingUtilities.convertPoint(textfield, e.getLocation(), panel);
}

Wobei textfield das zu bewegende Textfeld ist und panel das Panel, auf dem das Textfeld liegt. Der Mauszeiger befindet sich immer rund 30 Pixel vom Textfeld entfernt, während man es verschiebt.

mpG
Tobias
 

Nova

Bekanntes Mitglied
Hallo,

Ich prüfe vorher ob getMousePotition ungleich null ist, wenn gleich null dann mach ich eben nix (bzw. in meinem Fall Färbe ich die Hintergrundfarbe der zu zu verschiebenden Komponente rot, damit der User sieht das die Komponente an einer ungültigen Position ist).
Das kommt bei nur vor wenn die Maus außerhalb des Containers ist von welchem ich das getMousePotition(true) aufrufe.
Unsichtbar sollten die Komponenten ja nicht sein, wenn doch ist es ja auch egal das man nix verschieben kann...

Ich verwende das getMousePotition(ture) auch nicht nur zum verschieben eines Elements sondern auch für einige andere Funktionen, das "Projekt" an dem ich arbeite hat mittlerweile ca.1700 Zeilen Code...
Bei mir läuft das ganze problemlos!


mfg
Christian
 

Tobias

Top Contributor
Das Mauszeiger-Problem muss irgendwo ganz anders gelegen haben, nach einer Reorganisation des Codes funktioniert jetzt alles wunderbar.

Problem gelöst, vielen Dank.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben