JPanel nicht fließend verschiebbar

BlubBlub

Bekanntes Mitglied
Hi ich habe den unten aufgelisteten Code geschrieben.
In einem JFrame ist ein JPanel eingebettet. Dieses JPanel namens statePanel soll verschiebbar sein.
Der Benutzer drückt dabei mit der Maus auf das JPanel und kann es durch eine "Drag" Bewegung verschieben.

Problem: Das Panel folgt nicht exakt dem Mauszeiger. Sobald ich den Mauszeiger bewege, hinkt das JPanel enorm hinterher und ist recht sprunghaft. Vorallem liegt das JPanel auch nicht direkt unter dem Mauszeiger.
Was muss ich ich korrigieren, damit das JPanel immer direkt an der Postion ist wo der Mauszeiger sich befindet, sobald der Benutzer die Maustaste über dem JPanel gedrückt hält und die Maus bewegt?

Java:
public class Starter
{
	public static void main(String[] args)
	{
		new GraphicAnimator();
	}
}

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class GraphicAnimator extends JFrame
{
	private Container contentPane;
	private StatePanel statePanel;
	
	public GraphicAnimator()
	{
		super();
		setSize(700, 500);
		setLayout(new FlowLayout());
		contentPane = getContentPane();
		statePanel = new StatePanel();
		contentPane.add(statePanel);
		
		setVisible(true);
	}
}

Java:
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JPanel;
import javax.swing.border.LineBorder;


public class StatePanel extends JPanel
{	
	public StatePanel()
	{
		setPreferredSize(new Dimension(200, 100));
		setBackground(Color.CYAN);
		setBorder(new LineBorder(Color.BLACK));
		this.addMouseMotionListener(new StatePanelMouseMotionListener(this));
	}
}

Java:
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;


public class StatePanelMouseMotionListener implements MouseMotionListener
{
	private StatePanel statePanel;
	
	public StatePanelMouseMotionListener(StatePanel statePanel)
	{
		this.statePanel = statePanel;
	}

	@Override
	public void mouseDragged(MouseEvent me) 
	{
		statePanel.setLocation(me.getX(), me.getY());	
	}

	@Override
	public void mouseMoved(MouseEvent me) {}
}
 

njans

Top Contributor
Sind die Koordinaten des MouseEvents nicht relativ zu der Komponente auf der er liegt?
Ich meine es selbst mal bei mir gemacht zu haben und da hatte ich nicht direkt die Koordinaten des MEs genommen, sondern diese auf die Koordinaten des Fensters addiert.
 

BlubBlub

Bekanntes Mitglied
Jau du hast recht. Danke für den Hinweis. Ich habe den Code des MouseMotionListeners jetzt geändert. Der JPanel folgt jetzt dem Mauszeiger beim Drag.

Folgendes stört mich allerdings noch:
Angenommen der Mauszeiger ist in der Mitte des Panels.
Dann bewege ich bei gedrückter Maustaste die Maus.
Das Panel folgt der Maus.
Die Maus befindet sich beim Bewegen des Panels aber nicht mehr in ihrer Ursprünglichen
Position innerhalb des Panels.
Das heißt die Maus ist nicht mehr in der Mitte des Panels, sondern die ganze Zeit über
an der oberen linken Ecke des Panels.

Frage: Wie schafe ich es, dass die Maus weiterhin an der Stelle im JPanel ist, wo ich die Drag
Aktion gestartet habe.

Anmerkung: Im Code gibts die Variablen "mauszeigerXinPanel" und "mauszeigerYinPanel".
Damit kann ich festlegen, dass sich der Mauszeiger nicht in der oberen linken Ecke des Panels
befindet sondern um die jeweilige Pixel Anzahl verschoben im JPanel. Ich kriege es aber nicht
hin, dass der Mauszeiger an der Ursprünglichen Position bleibt.


Java:
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;


public class StatePanelMouseMotionListener implements MouseMotionListener
{
	@Override
	public void mouseDragged(MouseEvent me) 
	{
		System.out.println("\n Mauskoordinaten relativ zur Mausposition im Panel: " + me.getX() + " und " +  me.getY());
		System.out.println("\n JPanelkoordinaten relativ zum JFrame:" + me.getComponent().getX() + " und " + me.getComponent().getY());
		
		int mauszeigerXinPanel = -30;
		int mauszeigerYinPanel = -50;
		
		int X = me.getX()+me.getComponent().getX()+mauszeigerXinPanel;
		int Y = me.getY()+me.getComponent().getY()+mauszeigerYinPanel;
		
		me.getComponent().setLocation(X, Y);	
	}	
	
	@Override
	public void mouseMoved(MouseEvent me) {}
}
 

njans

Top Contributor
Ja das Problem hatte ich so gelöst:

Meine Komponente, die ich ziehen will ist MouseMotionListener und MouseListener
Java:
        // Exemplarvaribablen
        private boolean _isDragStarted = false;
	private Point _startPosDifference;


        // Methoden
	public void mouseDragged(MouseEvent e)
	{
		// Hier habe ich eigentlich noch eine Abfrage, so dass man nur auf einen kleinen 
                // Bereich klicken kann, um zu ziehen
		// Sobald der drag beginnt wird zuerst der Startpunkt gesetzt und der Status für den Drag
                // auf TRUE gesetzt. Danach wird genau das gemacht, was du auch schon hast.
			if (!_isDragStarted)
			{
				_startPosDifference = new Point(
						this.getLocation().x - e.getLocationOnScreen().x,
						this.getLocation().y -  e.getLocationOnScreen().y);
				_isDragStarted = true;
			}
			else
			{
				setLocation(e.getLocationOnScreen().x + _startPosDifference.x , 
						e.getLocationOnScreen().y + _startPosDifference.y);
			}
		
	}

        // Natürlich muss man den Drag wieder reseten, sonst kriegt man keinen neuen Startpunkt
	public void mouseReleased(MouseEvent arg0)
	{
                _isDragStarted = false;
         }
 
Zuletzt bearbeitet:

BlubBlub

Bekanntes Mitglied
So hab das jetzt auch angepasst. Funktioniert bei mir jetzt auch wunderbar, also Danke erstmal dafür.
Nun habe ich zwei Panels erstellt. Beide kann ich nun mit der Maus verschieben.
Ich habe in das JFrame die beiden Panels in folgender Reihenfolge platziert (siehe Pseudocoud).

Code:
frame.setLayout(new FlowLayout());
frame.getContentPane().add(PanelA);
frame.getContentPane().add(PanelB);

Wenn ich nun das PanelA über das PanelB ziehe, so verdeckt das PanelA das PanelB.
Wenn ich das PanelB über das PanelA ziehe, so liegt PanelB unter PanalA.
Dies liegt daran, dass ich in die contentPane des JFrame zuerst PanelA und dann PanelB eingefügt habe.

Frage: Wie schaffe ich es, dass ein Panel welches verschoben wird immer über dem Panel liegt das grad nicht
verschoben wird?
 

BlubBlub

Bekanntes Mitglied
Nee Null-Layout Manager ist keine gute Idee, da man sich später um die Größenanpassung der Panels und deren Darstellung etc. auf verschiedenen Plattformen selbst kümmern muss.

Ich habe das Problem jetzt gelöst, indem ich die Panels auf dieselbe Ebene innerhalb der Layered Pane gesetzt habe und dabei die Methode moveToFront(Component) verwende.

Allerdings habe ich noch ein weiteres Problem:
Nachdem ich die Position der Panels durch verschieben verändert habe und das JFrame
vergrößer/verkleiner oder maximiere/minimiere sind die beiden
verschobenen Panels wieder in der ursprünglichen Position.
Ich glaub das liegt daran, dass bem vergrößern/verkleinern und maximieren/minimieren das JFrame und seine Inhalte neu gezeichent werden.

Frage: Wie schaffe ich es, dass die neuen Panel Positionen erhalten bleiben?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Nee Null-Layout Manager ist keine gute Idee, da man sich später um die Größenanpassung der Panels und deren Darstellung etc. auf verschiedenen Plattformen selbst kümmern muss.
...
Nachdem ich die Position der Panels durch verschieben verändert habe und das JFrame
vergrößer/verkleiner oder maximiere/minimiere sind die beiden
verschobenen Panels wieder in der ursprünglichen Position.
Das macht der LayoutManager...

Frage: Wie schaffe ich es, dass die neuen Panel Positionen erhalten bleiben?

Mit einem null-Layout. Entweder oder. Du musst wählen.
 

BlubBlub

Bekanntes Mitglied
Nach längerem hin und her überlegen bin ich auch zum Entschluss gekommen das Null Layout zu
wählen, alles ändere wäre nur trickserei gewesen und unnötig kompliziert.

Anfangs wollte ich das Null Layout nicht verwendent, weil ich in den einzelnen verschiebbaren Panels
verschiedene Komponenten habe. Damit man die Komponenten sieht füge ich sie zuerst in das Panel
ein und anschließend setze ich die größe des Panel mit setBounds. Wobei um die ideale Größe zu erstellen frage ich das Panel nach dem Einfügen der einzelnen Komponenten nach seiner PreferredSize, welche ich anschließend in setBounds(...) setze. Somit ist es letztlich doch nicht so schlimm, dass ich für das LayeredPane keinen Layout Manager habe, der sonst die automatische Größenanpassung der Panels vorgenommen hätte.

Thx für die Tipps
 

Marco13

Top Contributor
Naja, "Trickserei" kann entweder ein Hack sein, oder irgendwas geschicktes ;) Man könnte sich vermutlich eine Lösung überlegen, bei der man die Components am Anfang einmal mit einen LayoutManager platziert, aber dann tatsächlich das null-Layout verwendet, um sie noch veschieben zu können. Eine "Mischung" (also einige layoutete Components und einige verschiebbare) auf EINEM Container wäre aber wohl wirklich ziemlich frickelig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
A Swing JPanel zeigt Buttons nicht an AWT, Swing, JavaFX & SWT 4
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
L GUI - Jpanel - Splitpane will nicht aktualisieren AWT, Swing, JavaFX & SWT 4
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
R JPanel paintComponents() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
J 2D-Grafik JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 0
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
R JPanel-Größe verändert sich nicht. Warum? AWT, Swing, JavaFX & SWT 5
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
K JPanel wird nicht gezeichnet AWT, Swing, JavaFX & SWT 4
Kenan89 LayoutManager JPanel wächst beim adden neuer JButtons nicht mit AWT, Swing, JavaFX & SWT 4
M BorderLayout JPanel liegt nicht richtig an AWT, Swing, JavaFX & SWT 12
K Swing remove(JPanel) funktioniert nicht AWT, Swing, JavaFX & SWT 5
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
P JPanel-Aufruf funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Swing JLabel wird in JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 2
E JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 3
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
J Bild in JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 9
0 JPanel nicht an größe des JFrames anpassen AWT, Swing, JavaFX & SWT 3
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
R Instanz einer Subklsse von JPanel wird nicht angezeigt. AWT, Swing, JavaFX & SWT 15
C Swing Größe vom JPanel anfangs nicht verfügbar AWT, Swing, JavaFX & SWT 3
R Swing erw.JPanel nicht vollständig angezeigt AWT, Swing, JavaFX & SWT 3
R Swing Button-Größe in JPanel mit GridBagLayout nicht änderbar AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
N JPanel zeichnet nicht AWT, Swing, JavaFX & SWT 6
P SetBounds auf JPanel geht nicht! AWT, Swing, JavaFX & SWT 2
J Swing JPanel mit Hintergrund zeigt componente nicht AWT, Swing, JavaFX & SWT 6
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
S JPanel-Dim reicht nicht aus, JScrollPane AWT, Swing, JavaFX & SWT 8
G JButton aus JPanel Class nicht erreichbar AWT, Swing, JavaFX & SWT 7
hdi Observer-Pattern bei JPanel nicht möglich? AWT, Swing, JavaFX & SWT 7
N JPanel nicht ganz drucken AWT, Swing, JavaFX & SWT 2
L JPanel und ScrollPanel funktionieren nicht AWT, Swing, JavaFX & SWT 3
P JPanel: setOpaque(false) funktioniert nicht AWT, Swing, JavaFX & SWT 27
T JPanel aktualisiert nicht AWT, Swing, JavaFX & SWT 3
N jpanel editierbar/nicht editierbar AWT, Swing, JavaFX & SWT 3
? Problem mit drawImage: bei Frame ok, bei JPanel nicht AWT, Swing, JavaFX & SWT 4
V Bild wird nicht auf JPanel gezeichnet; Java Problem AWT, Swing, JavaFX & SWT 10
P JPanel in JScrollPane -> funktioniert nicht(vertikal scro AWT, Swing, JavaFX & SWT 5
P Bild in JPanel einfügen funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JPanel: Buttons werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
T grafik in jpanel wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 7
M JPanel Position tut nicht, was sie soll AWT, Swing, JavaFX & SWT 8
M jwindow --> jpanel --> jpanel --> textfeld nicht en AWT, Swing, JavaFX & SWT 3
M Eigen gemaltes JPanel im ScrollPane. klappt nicht. :-( AWT, Swing, JavaFX & SWT 10
S JButtons in einem JPanel erscheinen nicht direkt AWT, Swing, JavaFX & SWT 7
M Änderungen an JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 8
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen


Oben