JPanel durch "klicken und ziehen" verschieben

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
ich möchte gerne einen JPanel durch klicken und ziehen verschieben.
Leider klappt das nur teilweise, denn das JPanel wird nicht exakt dort hin verschoben, wo ich das will und springt teilweise ganz woanders hin.

Hier der Quellcode:


Code:
public class IdentifierBuilder {
	
	public void IdentifierBuilder(){

	}
	
	public static void main(String args[]){
		IdentifierBuilder idBuilder = new IdentifierBuilder();
		Window window = new Window();
	}
}

Code:
import java.awt.event.*;
import javax.swing.*;
import java.awt.color.*;
import java.awt.*;

public class Window extends JFrame{
	
	private JFrame jfNewProject = new JFrame("Neues Projekt"); //Window to set up the id card.
	
	private JPanel contentPane = new JPanel(); // Here you add Window-Components
	
	private JMenuBar menuBar = new JMenuBar(); 
	private JMenu fileMenu = new JMenu( "Datei" );
	private JMenuItem newProject = new JMenuItem("Neues Projekt");
	
	private JPanel idCard = new JPanel();
	
	private int widthIDCard;
	private int heightIDCard;
	
	private ComponentManager compManager = new ComponentManager();
	
	public Window(){
		super("Ausweis-Ersteller"); //Titel
		
		contentPane.setBackground(Color.GRAY);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Programm exits on pressing Exit-Button
			
		this.setContentPane(contentPane); //Setting contentpane
		
		this.setMenu();
	    
	    this.setSize(700, 700);
	    this.setLocationRelativeTo(null); //Sets the window in the middle of the screen
	    this.setVisible( true );
	}
	
	private void setMenu(){
		this.setJMenuBar( menuBar );
		
		menuBar.add( fileMenu ); 
		fileMenu.add(newProject);    
	    
	    newProject.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		newProject();
	    	}
	    });
	    
	}
	
	private void newProject(){
		
		JPanel contentPane2 = new JPanel();
		jfNewProject.setContentPane(contentPane2);
		
		JLabel jlWidth = new JLabel("Breite in Pixel");
		JLabel jlHeight= new JLabel("Höhe in Pixel");
		
		JButton jbOK = new JButton("OK");
		JButton jbCancel = new JButton("Abbrechen");
		
		final JTextField jtfWidth = new JTextField(5);
		final JTextField jtfHeight = new JTextField(5);
		
		contentPane2.add(jlWidth);
		contentPane2.add(jtfWidth);
		contentPane2.add(jlHeight);
		contentPane2.add(jtfHeight);
		contentPane2.add(jbOK);
		contentPane2.add(jbCancel);
		
		jfNewProject.setSize(100, 100);
		jfNewProject.setLocationRelativeTo(null);
		jfNewProject.setVisible( true );
		jfNewProject.pack();
		jbOK.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		
	    		widthIDCard = Integer.parseInt(jtfWidth.getText());
	    		heightIDCard = Integer.parseInt(jtfHeight.getText());
	    		idCard.setPreferredSize(new Dimension( widthIDCard, heightIDCard ));
	    		idCard.setBackground(Color.white);
	    		idCard.setBorder(BorderFactory.createLineBorder(Color.black));
	    		
	    		
	    		contentPane.add(idCard);
	    		
	    		compManager.addComponent("idCard", idCard);
	    		
	    		repaintWindow();
	    		
	    		jfNewProject.dispose();
	    	}
	    });
		
		jbCancel.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		jfNewProject.dispose();
	    	}
	    });
	}
	
	private void repaintWindow(){
		this.validate();
	}
	
}

Code:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ComponentManager {
	
	private boolean isMarked = false;
	
	private HashMap map = new HashMap <String, Component> ();
	
	private Component component;
	
	public ComponentManager(){

	}
	
	public void addComponent(String name, Component comp){
		this.component = comp;
		
		this.component.addMouseMotionListener(new MouseMotionAdapter(){
			public void mouseDragged(MouseEvent e){
				int x = e.getX();
				int y = e.getY();
				
				component.setLocation(x, y);
			}
		});
		map.put(name, comp);
	}
	
	private Component getComponent(String name){ //Wird momentan nicht verwendet
		return (Component) map.get(name);
	}

}

Falls mir jemand weiterhelfen könnte, wäre ich sehr dankbar!

Liebe Grüße
Reality
 
S

SlaterB

Gast
x/y vom MouseEvent sind relativ zur Location des JPanels, nicht zum JFrame, das bringst du durcheinander,
etwas besser wirds mit
int x = e.getX()+component.getLocation().x;
int y = e.getY()+component.getLocation().y;

aber dann hast du immer noch leichte Sprünge,
die linke obere Ecke des JPanels springt zum Mauszeiger,

du musst bei mousePressed() die x/y-Werte speichern (Versatz zur linken oberen Ecke des JPanels) und bei den folgenden mouseDragged()-Events miteinberechnen
 

Reality

Top Contributor
Hi SlaterB,
danke, darauf wäre ich wirklich nicht von alleine gekommen! :-D

Ich finde den Code jedoch etwas aufgebläht:

Code:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ComponentManager {
	//Will be initialized when the mouse on a component was been pressed.
	//Saves the coordinates and will be calculated with the coordinates of the panel to move the panel exactly
	private int pressedMouseOnX;
	private int pressedMouseOnY;
	
	private boolean isMarked = false;
	
	private HashMap map = new HashMap <String, Component> ();
	
	private Component component;
	
	public ComponentManager(){

	}
	
	public void addComponent(String name, Component comp){
		this.component = comp;
		
		this.component.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent e){
				pressedMouseOnX = e.getX();
				pressedMouseOnY = e.getY();
				System.out.println(pressedMouseOnX + " " + pressedMouseOnY);
			}
		});
		
		this.component.addMouseMotionListener(new MouseMotionAdapter(){
			public void mouseDragged(MouseEvent e){
				int x = e.getX()+component.getLocation().x;
				int y = e.getY()+component.getLocation().y; 
				
				int tmpX = x - pressedMouseOnX;
				int tmpY = y - pressedMouseOnY;
				
				System.out.println(e.getX() + " " + e.getY());
				System.out.println(tmpX + " " + tmpY);
				component.setLocation(tmpX, tmpY);
			}
		});
		map.put(name, comp);
	}
	
	private Component getComponent(String name){ //Wird momentan nicht verwendet
		return (Component) map.get(name);
	}

}

Wieso bewegt sich der Panel eigentlich nicht, wenn man NUR component.getLocation() anwendet? Denn, wie ich herausfand, sind die Koordinaten von getX() und getY von mouseDragged und mousePressed identisch und das was ich effektiv anwende, ist ein component.getLocation, denn das getX und das getY, das ich hinzuaddiere, wird weiter unten wieder subtrahiert.
Nur geht ein component.getLocation nicht alleine. Der JPanel bewegt sich dann überhaupt nicht!

Liebe Grüße
Reality
 
S

SlaterB

Gast
wenn du die Maus einen Pixel wegbewegst vom Ursprungsklick,
dann wirst du auch andere x/y in deiner Ausgabe sehen,
dann ist eben y nicht mehr pressedMouseOnY und das JPanel bewegt sich um einen Pixel,

je nachdem wie schnell gezeichnet wird, gilt danach schon die neue Location,
aber das ist egal:
wenn du dich zwei Pixel bewegt hast, dann könnte die Berechnung entweder um zwei Pixel von der Urspungslocation ausgeführt werden oder um einem Pixel von der letzen Bewegung, es kommt das gleiche heraus, kein Flimmern möglich
 

Reality

Top Contributor
Hi SlaterB!
Danke, für deine Antwort!

Jetzt habe ich ein neues Problem:

Wenn ich mehrere JPanels hinzufüge (z. B. einmal ein Bild in einem JPanel oder JLabel und einmal ein JPanel mit weißen Hintergrund), dann ist immer nur das JPanel ansprechbar, das zuletzt hinzugefügt wurde.

Wie kann ich diesen Bug beheben?

Liebe Grüße
Reality
 
S

SlaterB

Gast
was fürn Bug? 'Programmdesign' vielleicht,

der Listener arbeitet mit
private Component component;
welches ja immer nur eines sein kann,
lass den Listener dagegen Component comp bearbeiten, das ist jeweils das eingefügte Element,

solche Dinge sind aber unterste Grundlagen bzw. einfach nur Denken,
ohne das kannst du so ein Programm nicht schreiben,

lange werde ich das nicht mehr mitmachen
 

Reality

Top Contributor
Sorry, die Regeln von Java kenne ich noch nicht sonderlich gut.

der Listener arbeitet mit
private Component component;
welches ja immer nur eines sein kann

Wieso klappt das dann mit mehreren Buttons in einer GUI auch? Die sind ja auch Ableitungen von Component.

Liebe Grüße
Reality
 
S

SlaterB

Gast
ob Component oder nix, hat nix zu sagen,

es geht darum mit WELCHEM Objekt der Listener arbeitet,
im Moment sagst du allen Listenern, dass sie, wenn sie mal dran kommen, mit dem Objekt arbeiten sollen, welches unter
private Component component;
gespeichert ist,
und das kann nunmal immer nur eins sein, das zuletzt registrierte,

du musst die Listener umstellen, so dass sie mit dem Parameter 'Component comp' arbeiten,
der muss dafür final sein,

pressedMouseX/Y sollte besser auch in ein eigenes Objekt pro Komponente,
da man aber eh nur ein Objekt gleichzeitig bewegen kann ist das erstmal kein Fehler
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
P JPanel- Listener durch JTextArea aktivieren AWT, Swing, JavaFX & SWT 8
Z JPanel wird erst durch aufziehen des Fensters sichtbar AWT, Swing, JavaFX & SWT 3
badfish Swing JPanel austauschen durch Button-Druck AWT, Swing, JavaFX & SWT 6
M JPanel in JPanel: grösse des inneren begrenzt durch äusseres AWT, Swing, JavaFX & SWT 4
B Tabsetpanel durch JPanel ersetzen! AWT, Swing, JavaFX & SWT 4
B JPanel erst durch Button-Klick sichtbar machen 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
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
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
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
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
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
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
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
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
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel 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
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
kilopack15 JPanel im laufenden Zustand einfärben AWT, Swing, JavaFX & SWT 2
kilopack15 JPanel Farbverwaltung AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
F Zeichnung einem JPanel im Layoutmanager zuweisen AWT, Swing, JavaFX & SWT 3
Meeresgott Swing Umgang mit JPanel AWT, Swing, JavaFX & SWT 4
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
J Swing Zeichenfläche im JPanel des Haupfenster anzeigen lassen AWT, Swing, JavaFX & SWT 4
A Swing JPanel zeigt Buttons nicht an AWT, Swing, JavaFX & SWT 4
R JPanel überzeichnet alles? AWT, Swing, JavaFX & SWT 1
D Von JPanel auf anderes JPanel zugreifen AWT, Swing, JavaFX & SWT 9
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
I JPanel - Verwaltung/ Anordnung AWT, Swing, JavaFX & SWT 4
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
K Swing JPanel ueber komplette Form legen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
S jpanel anchor bottom AWT, Swing, JavaFX & SWT 1
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
F JPanel "verschmelzen" GridLayout AWT, Swing, JavaFX & SWT 10
B Dropdown "Einstellungen" auf JPanel, transparent AWT, Swing, JavaFX & SWT 1
D GlassPane für JPanel AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
O 2D-Grafik Zeichenfläche auf JPanel AWT, Swing, JavaFX & SWT 4
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben