Swing Elemente auf Zeichenfeld verschieben

Kaffeebohn

Bekanntes Mitglied
Hallo zusammen,

ich möchte mit Swing ein Programm bastlen, welches eine "Zeichenfläche" besitzt, auf der man kleine Kästchen anlegen kann (So in der Art wie Notizen). Die Position soll man frei bestimmen können und das Kästchen auch nachher wieder verschieben mit der Maus. Mehrere Kästchen soll man frei verbinden können mit Linien. Ich denke grundsätzlich ist klar was ich meine.

Allerdings fehlt mir ein Einstiegspunkt womit man sowas eigentlich löst. Könnt ihr mir vielleicht nen Tipp geben? Habe jetzt einiges zu Drag and Drop gefunden, aber das hilft mir nicht so weiter.

Danke und Grüße,

Kaffeebohn
 

carolin

Mitglied
Hallo,

ich habe sowas schon programmiert (allerdings mit einem anderen Hintergrund).
Meine Lösung war mittels DnD, die Linien zeichne ich indem ich die paintComponent()-Methode überschreibe.

Was genau ist denn dein Problem bei Dnd? Und welche Ansätze hast du schon? (z.b. durch welche Komponenten willst du die einzelnen Sachen realisieren?)
 
Zuletzt bearbeitet:

Kaffeebohn

Bekanntes Mitglied
Hi zusammen,

Danke erstmal für eure Antworten.

Derzeit versuche ich es halbwegs erfolgreich über JPanels und den MouseMotionListener. Ich habe also ein Panel, in dieses füge ich ein neues JPanel hinzu, welches einen MouseMotionListener implementiert und beim Draggen immer die Position aktualisiert. das funktioniert im Prinzip schon sehr gut. Leider habe ich noch ziemliche Probleme damit, die neue Position zu berechnen. Ich schaffe es bisher nur, die JPanels so zu verschieben, als würde man sie exakt bei den Koordinaten (0/0) greifen.

Liebe Grüße,
Kaffeebohn
 

Kaffeebohn

Bekanntes Mitglied
Mein Problem ist derzeit, wie ich dem MouseMotionListener die Position der Maus relativ zum übergeordneten Panel durchgeben kann. Wenn ich mit getYOnScreen() arbeite funktioniert es zwar, da ich dann eine absolute Position erhalte, aber das bringt mich nicht weiter da man ja auch das Fenster verschieben können soll.

Edit: Vielleicht kurz das Code-Beispiel dazu:

Java:
public void mouseDragged(MouseEvent me) {
		
		int dragX, dragY, dragXOS, dragYOS;
		
		Component dragComponent = (Component)me.getSource();
		
		  dragX = me.getX();
		  dragY = me.getY();
		  
		  
		  
		  dragXOS = me.getXOnScreen();
		  dragYOS = me.getYOnScreen();
		  

		  
		  dragComponent.setBounds((dragXOS), dragYOS, dragComponent.getWidth(), dragComponent.getHeight());
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Ich würde sowieso nur mit Listenern auf den übergeordneten Panel arbeiten - und die Objekte selbst definieren anstelle von JPanel zu erben.
Hab hier mal was auf die Schnelle runtergeschrieben, wie ich an die Sache rangehen würde (hat ohne Frage noch Verbesserungspotential, aber mehr war in 20 Minuten nicht drin)
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

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

public class BoxDragging {
	
	public static void main(String[] s) {
		JFrame frame = new JFrame();
		frame.setBounds(0, 0, 500, 500);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(new BoxDragging().new BoxPanel());
		frame.setVisible(true);
	}
	
	class BoxPanel extends JPanel {
		private List<Box> boxList;
		private int currentBox = -1;
		private Point clickPoint;
		private Point position;
		
		public BoxPanel() {
			boxList = new ArrayList<Box>();
			Box box = new Box(50, 50);
			box.setLocation(50, 50);
			boxList.add(box);
			
			this.addMouseListener(new MouseListener() {
				public void mouseClicked(MouseEvent e) {}
				public void mouseEntered(MouseEvent e) {}

				public void mouseExited(MouseEvent e) {
					currentBox = -1;
				}

				public void mousePressed(MouseEvent e) {
					for (int i=boxList.size()-1; i>=0; i--) {
						clickPoint = e.getPoint();
						Box box = boxList.get(i);
						if (box.getBounds().contains(clickPoint)) {
							currentBox = i;
							position = new Point(box.getBounds().x, box.getBounds().y); 
							return;
						}
					}
				}

				public void mouseReleased(MouseEvent e) {
					currentBox = -1;
				}
			});
			
			this.addMouseMotionListener(new MouseMotionListener() {
				public void mouseDragged(MouseEvent e) {
					if (currentBox!= -1) {
						Box box = boxList.get(currentBox);
						Point p = e.getPoint();
						box.setLocation(position.x + (p.x - clickPoint.x), position.y + p.y - clickPoint.y);
						repaint();
					}
				}

				public void mouseMoved(MouseEvent e) {}
			});
		}
		
		public void addBox(Box box) {
			this.boxList.add(box);
			this.repaint();
		}
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			for (Box box: boxList)
				box.paintComponent(g);
		}
	}
	
	class Box {
		private int x, y;
		private int width, height;
		private Stroke stroke = new BasicStroke(3);
		private Rectangle bounds;
		
		public Box(int width, int height) {
			this.width = width;
			this.height = height;
			this.setLocation(0, 0);
		}
		
		public void setLocation(int x, int y) {
			this.x = x;
			this.y = y;
			bounds = new Rectangle(x, y, width, height);
		}
		
		public Rectangle getBounds() {
			return bounds;
		}
		
		public void paintComponent(Graphics g) {
			Graphics2D g2 = (Graphics2D)g.create();
			g2.setStroke(stroke);
			g2.setColor(Color.WHITE);
			g2.fillRoundRect(x, y, width, height, 5, 5);
			g2.setColor(Color.DARK_GRAY);
			g2.drawRoundRect(x, y, width, height, 5, 5);
			g2.dispose();
		}
	}
}
 

Kaffeebohn

Bekanntes Mitglied
Hi Michael...,


Vielen Dank für deine Mühe. Ich hab mir dein Code-Beispiel jetzt angeschaut und ein bisschen damit rumexperimentiert und es funktioniert soweit auch gut. Leider bin ich mit dem zeichnen eigener Komponenten nicht gerade vertraut und ich weiß noch nicht so genau ob ich auch die Fenster, die ich mir wünsche, hinbekomme (das wäre mit vielen kleinen JPanels wohl einfacher gewesen) aber ich arbeite dran :)

Liebe Grüße,
Kaffeebohn
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
M Swing JList - Elemente umbenennen? AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
B In externer Eventhandlerklasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
K BoxLayout skaliert die "falschen" Elemente AWT, Swing, JavaFX & SWT 5
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
T Elemente werden nicht direkt angezeigt AWT, Swing, JavaFX & SWT 3
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
K Titel für eingebundene Elemente wie JPanel AWT, Swing, JavaFX & SWT 3
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
J LayoutManager der Elemente untereinander anordnet. AWT, Swing, JavaFX & SWT 11
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
S List Elemente AWT, Swing, JavaFX & SWT 4
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
E GUI-Elemente aus txt- oder xml-File erstellen? AWT, Swing, JavaFX & SWT 5
J FAQ programmieren, welche Swing-Elemente AWT, Swing, JavaFX & SWT 7
M Elemente hängen dicht aufeinander AWT, Swing, JavaFX & SWT 2
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6
DEvent Je nach Auswahl in Liste entsprechende Input-Elemente anzeig AWT, Swing, JavaFX & SWT 2
W Elemente aus JPanel bzw. GridBag löschen und ersetzen AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen


Oben