Swing Drag n Drop Verschieben von Labels o.ä.

Enigma228

Bekanntes Mitglied
Hallo.. ich hab mal wieder ein Problem und suche alternative Lösungen.

ich habe ein Feld (2 Column ,3 Rows)

Lab1 Pan1
Lab2 Pan2
Lab3 Pan3

und ein Feld (3 Rows)
Pan4
Pan5
Pan6
auf diesen Panels(Pan4-6) liegt jeweils ein Label oder ähnliches(z.B. Button)

Ich möchte mit Hilfe von DnD das Label(oder Button) auf Pan1-3 legen können.
Leider habe ich in der Java Hilfe nichts entsprechendes gefunden oder (schlimmstenfalls) überlesen.
Dort werden meiner Meinung nach nur Textbausteine als DnD-Objekte genutzt.

Gibt es dafür ein Tutorial? oder ist sowas gar nicht möglich und ich muss anderweitig improvisieren?

Vielen Dank
Thomas
 

Network

Top Contributor
MouseListener auf die Panels legen.
Bei einem Drag n Drop Event (ist im MouseListener integriert) ein leicht transparentes Abbild, des zu verschiebenden Objektes, der Maus folgen lassen.

Die Position der Maus lässt sich auch durch den MouseListener bestimmen!
Java:
public void mouseDragged(MouseEvent e) 
{
        movelabel.setLocation(e.getX(), e.getY()); 
}
\\ Achtung: Der Mauszeiger liegt hier auf der Objekt-Ecke

Dann beim loslassen gibt es mehrere Methoden um die Zielposition zu realisieren!
Ich empfehle die "mouseEntered" und "mouseExited" Funktion, um die derzeitige Position zu bestimmen. Bzw. das Panel zu bestimmen, das derzeitig ausgewählt ist.

Und zum schluss, wird dann die neue Location, des Objektes auf diesen neuen Panel gelegt.
Also:
Java:
pan3.add( Object );
Die ehemalige Position, auf dem alten Panel wird automatisch gelöscht!
 

Enigma228

Bekanntes Mitglied
Hier mal mein Testcode:
Wo könnte mein Fehler liegen?
Er gibt trotz der Vielen system.outs keinen Ton von sich..
Das Fenster ist komplett mit allen Panels und Labels zu sehen.
Achja das Zeichnen der Bewegung habe ich erstmal verschoben.
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MyFrame extends JFrame {

	private JLabel[] lab = new JLabel[6]; 
	private JPanel[] pan = new JPanel[6]; 
	private int label;
	public MyFrame() throws HeadlessException {
		
		label =-1;
		Dimension d = new Dimension(320,320);
		this.setLocationRelativeTo(null);
		this.setMinimumSize(d);
		this.setLayout(new GridLayout(3,3));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		for (int i=0;i<6;i++){
			lab[i]= new JLabel();
			lab[i].setSize(100,100);
			lab[i].setOpaque(true);
			lab[i].setBackground(Color.green);
			lab[i].setBorder(BorderFactory.createRaisedBevelBorder());
			lab[i].setText(""+i);
			pan[i]= new JPanel();
			pan[i].setSize(100, 100);
			pan[i].setBackground(Color.BLUE);
			pan[i].setBorder(BorderFactory.createEtchedBorder(1));
			pan[i].setLayout(null);
			pan[i].addMouseListener(new MouseAdapter() {
				@Override
				public void mouseReleased(MouseEvent e) {
					System.out.println("released on a panel");
					System.out.println(""+e.getSource());
					if(label>-1){
						if(e.getSource()==pan[0]){
							pan[0].add(lab[label]);
							System.out.println("Label "+label+" an Panel 0 übergeben");
						}
						if(e.getSource()==pan[1]){
							pan[1].add(lab[label]);
							System.out.println("Label "+label+" an Panel 1 übergeben");
						}
						if(e.getSource()==pan[2]){
							pan[2].add(lab[label]);
							System.out.println("Label "+label+" an Panel 2 übergeben");
						}
						if(e.getSource()==pan[3]){
							pan[3].add(lab[label]);
							System.out.println("Label "+label+" an Panel 3 übergeben");
						}
						if(e.getSource()==pan[4]){
							pan[4].add(lab[label]);
							System.out.println("Label "+label+" an Panel 4 übergeben");
						}
						if(e.getSource()==pan[5]){
							pan[5].add(lab[label]);
							System.out.println("Label "+label+" an Panel 5 übergeben");
						}
						
						label=-1;
					}
				}
			});
		}
		
		for (int i=3; i<6;i++){
			pan[i].add(lab[i]);
			lab[i].setBounds(0, 0, 50, 50);
			lab[i].addMouseListener(new MouseAdapter() {
				@Override
				public void mouseDragged(MouseEvent e){
					System.out.println("dragged a label");
					System.out.println(e.getSource());
					if(e.getSource()==lab[3]){
						label=3;
						lab[3].setLocation(e.getX(), e.getY());
					}
					if(e.getSource()==lab[4]){
						label=4;
						lab[4].setLocation(e.getX(), e.getY());
					}
					if(e.getSource()==lab[5]){
						label=5;
						lab[6].setLocation(e.getX(), e.getY());
					}
				}
			});
		}
		
		this.add(lab[0]);
		this.add(pan[0]);
		this.add(pan[3]);
		this.add(lab[1]);
		this.add(pan[1]);
		this.add(pan[4]);
		this.add(lab[2]);
		this.add(pan[2]);
		this.add(pan[5]);
	}
}
 

Network

Top Contributor

:lol: Ich hab die DnD-Klassen vorher nicht gekannt... aber beim durchlesen fällt einem doch auf, dass es so ziemlich das selbe ist, wie ich hier mit dem MouseListener als Lösung vorgeschlagen habe. bis auf die Tatsache, dass in diesem Fall, das ganze bereits als Klasse geschrieben wurde. Ich bin ja sowas von genial :D

Zum Fehler fals du immernoch es auf deine jetzt verwendete Art lösen möchtest:
"label" ist immer -1 !!!
oder habe ich da was übersehen, es wird niemals in der Schleife geändert, es sei denn es ist größer -1 dann wird es wieder auf -1 gesetzt!
Dieser If-Satz label>-1 wird also niemals den Wert true zurückgeben!

Eine einfachere Methode ist aber auch sicherlich, die MouseDragged Metode nicht mit Override zu versehen. Sondern sie als eigenen part im Code darzustellen, der immer aktiviert wird, sobald man die Mouse gedrückt hält.
 
G

Gast2

Gast
:lol: Ich hab die DnD-Klassen vorher nicht gekannt... aber beim durchlesen fällt einem doch auf, dass es so ziemlich das selbe ist, wie ich hier mit dem MouseListener als Lösung vorgeschlagen habe. bis auf die Tatsache, dass in diesem Fall, das ganze bereits als Klasse geschrieben wurde. Ich bin ja sowas von genial :D

Die Klassen können viel mehr. z.B. wird automatisch geprüft wohin man hindraggen darf und nicht. Naja wie gesagt würde die DnD nehmen.
 

Enigma228

Bekanntes Mitglied
Habe das Problem jetzt mit MouseListener gelöst. Ich "ziehe" also nicht, sondern klicke Startobjekt an und dann Zielpanel und weise dann zu.

Ach ja meine Vorgehensweise:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;

public class MoveGamePanel extends JPanel {

	private JPanel p[] = new JPanel[20];
	private JToggleButton tb[] = new JToggleButton[10];
	private JLabel l[] = new JLabel[10];
	private Color user_gray, user_green, user_green2, user_orange, user_yellow, user_red;
	private JPanel p_buttons, p_field;
	
	public MoveGamePanel() {

		user_gray = new Color(212,208,200);
		user_green = new Color(207,239,148);
		user_green2 = new Color(52,218,89);
		user_orange = new Color(255,210,140);
		user_yellow = new Color(255,255,215);
		user_red = new Color(250, 210, 210);
		
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
		} catch(Exception e) {
		    System.out.println("Error setting native LAF: " + e);
		}
		this.setSize(550, 400);
		this.setLayout(new BorderLayout(20,20));
		this.setBackground(user_gray);
		
		
		MyMouseListener mml = new MyMouseListener();
		MyActionListener mal = new MyActionListener();
		
		Dimension d = new Dimension(150,390);
		
		p_field = new JPanel(new GridLayout(5,4,3,3));
		p_buttons = new JPanel(new GridLayout(5,2));
		p_buttons.setPreferredSize(d);
		p_buttons.setMinimumSize(d);
		
		for(int i=0;i<10;i++){
			tb[i] = new JToggleButton(""+i);
			tb[i].addActionListener(mal);
			tb[i].setBackground(user_orange);
		}
		
		for (int i=0;i<10;i++){
			l[i]= new JLabel(""+i);
			l[i].setBorder(BorderFactory.createRaisedBevelBorder());
			l[i].setHorizontalAlignment(JLabel.CENTER);
			l[i].setOpaque(true);
			l[i].setBackground(Color.WHITE);
		}
		
		for (int i=0;i<20;i++){
			p[i] = new JPanel();
			p[i].setBorder(BorderFactory.createBevelBorder(1));
			p[i].setLayout(new GridLayout());
			p[i].addMouseListener(mml);
			p[i].setBackground(user_gray);
			if(i>9){
				p[i].add(tb[i-10]);
			}
		}
		
		for(int i=0;i<10;i++){
			this.add(l[i]);
			this.add(p[i*2]);
			this.add(p[(i*2)+1]);
		}
		
		for(int i=0;i<20;i++){
			if(i<10){
				p_field.add(l[i]);
				p_field.add(p[i]);
			}else{
				p_buttons.add(p[i]);
			}
			
		}
		this.add(p_field, BorderLayout.CENTER);
		this.add(p_buttons, BorderLayout.LINE_END);
	}

	public class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			for (int i=0;i<10;i++){
				if(e.getSource()!=tb[i]){
					if(tb[i].isSelected())tb[i].setSelected(false);
				}else{
					tb[i].setBorder(BorderFactory.createEtchedBorder(2, Color.RED, Color.DARK_GRAY));
				}
			}
		}
	}
	
	public class MyMouseListener extends MouseAdapter {

		
		@Override
		public void mouseClicked(MouseEvent arg0) {
			
		}

		@Override
		public void mouseEntered(MouseEvent arg0) {
			((JPanel)arg0.getComponent()).setBorder(BorderFactory.createEtchedBorder(2, Color.RED, Color.DARK_GRAY));			
		}

		@Override
		public void mouseExited(MouseEvent arg0) {
			((JPanel)arg0.getComponent()).setBorder(BorderFactory.createBevelBorder(1));					
		}

		@Override
		public void mousePressed(MouseEvent arg0) {			
			for (int i=0;i<10;i++){
				if(tb[i].isSelected()){
					((JPanel)arg0.getComponent()).add(tb[i]);
					tb[i].setSelected(false);
					tb[i].setBorder(BorderFactory.createCompoundBorder());
					break;
				}
			}
			for(int i=0;i<20;i++)p[i].repaint();
		}

		@Override
		public void mouseReleased(MouseEvent arg0) {
			
		}
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
J Nochmal Drag&Drop, ABER: Object verschieben AWT, Swing, JavaFX & SWT 2
S drag&drop bild verschieben AWT, Swing, JavaFX & SWT 14
Student Drag & Drop: Index nach verschieben herausfinden AWT, Swing, JavaFX & SWT 3
L Grafikobjekte per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 3
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JavaFX Pane per Drag&Drop bewegen? AWT, Swing, JavaFX & SWT 2
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
F Drag und Drop AWT, Swing, JavaFX & SWT 0
L JavaFX JavaFX Chart Drag and Drop AWT, Swing, JavaFX & SWT 3
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
U Drag and Drop mit imageview AWT, Swing, JavaFX & SWT 0
U Drag and Drop imageviews AWT, Swing, JavaFX & SWT 8
D SteelSeries in Netbeans als Drag-and-Drop einbinden AWT, Swing, JavaFX & SWT 0
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
S Swing Suche Drag & Drop Beispiele AWT, Swing, JavaFX & SWT 1
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
R Drag and Drop Problem auf Jpanel AWT, Swing, JavaFX & SWT 2
N Swing JTable und Drag und Drop AWT, Swing, JavaFX & SWT 2
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
C Drag and Drop (inventar) AWT, Swing, JavaFX & SWT 15
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
R Drag 'n Drop AWT, Swing, JavaFX & SWT 3
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
T Swing Drag and Drop - JLabels tauschen statt überschreiben AWT, Swing, JavaFX & SWT 11
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
B Drag and Drop AWT, Swing, JavaFX & SWT 6
K Drag and Drop Workbench AWT, Swing, JavaFX & SWT 2
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
F SWT Drag and Drop im TreeViewer AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
A TransferHandler & Drag n' Drop AWT, Swing, JavaFX & SWT 2
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
D Drag & Drop - node.isRoot AWT, Swing, JavaFX & SWT 3
E Swing Beim Drag & Drop, Drag verbieten?! AWT, Swing, JavaFX & SWT 2
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Swing JList > Drag & Drop AWT, Swing, JavaFX & SWT 2
C Drag an Drop vom JTree zur JTable AWT, Swing, JavaFX & SWT 4
Z Drag and Drop auf Application AWT, Swing, JavaFX & SWT 3
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JTable drag and drop AWT, Swing, JavaFX & SWT 4
H Drag&Drop mit GWT AWT, Swing, JavaFX & SWT 8
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
V SWT TreeViewer Drag'n'Drop LocalSelectionTransfer AWT, Swing, JavaFX & SWT 10
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Drag'n'Drop AWT, Swing, JavaFX & SWT 8
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
M Drag & Drop in Swing (createTransferable) AWT, Swing, JavaFX & SWT 6
T Drag Quelle beim Drop AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5
P Dateien per Drag&Drop ins Java-Fenster ziehen AWT, Swing, JavaFX & SWT 8
G JTree Node ggf. aufklappen bei Drag & Drop? AWT, Swing, JavaFX & SWT 7
J Drag'n Drop imm selben Frame unterbinden AWT, Swing, JavaFX & SWT 3
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
X wiedermal Drag n Drop AWT, Swing, JavaFX & SWT 2
P Drag & Drop AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben