Drag and Drop Funktion mit JLabel

Status
Nicht offen für weitere Antworten.
Hallo Community,

ich habe folgendes Problem --> ich versuche seit einiger Zeit ein JLabel mit einer Drag and Drop Funktion anzusprechen. Ich bin durch fleißiges suchen und ausprobieren darauf gekommen das es nicht so geht wie ich mir das vorstelle.

Und zwar das JLabel hat keinen Text sondern ein ImageIcon, dieses JLabel Element muss die Funktionalität erhalten von Punkt A nach Punkt B gezogen zu werden und beim ziehen über das Frame sichtbar sein.

Hier meine gescheiterten Versuche:

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.dnd.DragSource;
import java.awt.event.MouseEvent;
import javax.swing.*;

import javax.swing.JComponent;
import java.awt.event.MouseAdapter;

import javax.swing.JFrame;

public class testDrag extends JComponent {

    public JFrame frame = new JFrame("testDrag");
    public ImageIcon ico = new ImageIcon("../mobili_prototyp/images/anschluesse/Anschluss4_vor_grau.jpg");
    public JComponent c = null;
    public JLabel componentType = new JLabel(ico);
    
    DragSource dragSource;
    boolean dragMode;

    public testDrag() {
    }

    public testDrag(boolean unwichtig){
        jbInit();
    }
    
    public void setDragMode(boolean dragMode) {
        this.dragMode = dragMode;
    }
    
    public boolean getDragMode() {
      return dragMode;
    }
    
    public void jbInit(){
        final testDrag td;
        td = new testDrag();
        frame.getContentPane().add(td, BorderLayout.CENTER);
        componentType.setBackground(new Color(0,0,0));
        componentType.setSize(31,31);
        componentType.setLocation(0,0);
        frame.getContentPane().setLayout(null);
        frame.getContentPane().add(componentType, null);
        
        frame.setSize(400, 400);
        frame.setVisible(true);
        
        componentType.setTransferHandler(new TransferHandler("text"));
        //componentType.
        frame.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                System.out.println(e.getX() + "  " + e.getY());
                //JComponent c = (JComponent)e.getSource();
                componentType.setLocation(e.getX(), e.getY());
            }
        });
        componentType.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e){
                c = (JComponent)e.getSource();
            }
            public void mousePressed(MouseEvent e) {
               //TransferHandler th = c.getTransferHandler();
               //th.exportAsDrag(c, e, TransferHandler.COPY);
            }
            public void mouseReleased(MouseEvent e) {
                c.setLocation(0,0);
                c.setLocation(e.getX(), e.getY());
                System.out.println("2: " + c.getX() + "  " + c.getY());
                //c.repaint();
            }
            public void mouseExited(MouseEvent e) {
                
            }
            public void mouseDrag(MouseEvent e){
                System.out.println("4: " + c.getX() + "  " + c.getY());
                //c.setLocation(c.getX(), c.getY());
            }
        });
    }
    
    public static void main(String[] args) {
        testDrag tud = new testDrag(true);
    }
}

Ich habs versucht über die MouseEvents, wobei er das "mouseDrag" Event gar nicht ernst nimmt, über das setLocation funktioniert es einmal und dann geht er, warum auch immer, in die Minuszahlen und mit dem klicken auf dem Frame, war auch nur ein Test, positioniert er mein Label irgendwie komisch.

Bitte um Hilfe falls sich jemand damit auskennt ich blick da irgendwie nicht mehr durch.

lg - a cup of java
 
S

SlaterB

Gast
vergesse nie
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sonst hast du immer alte Java-Programme, die unsichtbar auf deinem PC weiterlaufen

----

mouseDrag ist Quatsch, mouseDragged heißt die Operation,
aber das muss natürlich ein MouseMotionListener sein, da fehlte noch einiges,

bei der Berechnung der Position gibt es einige Schwierigkeiten,
da das MouseEvent x/y relativ zur Postition des Icons berechnet wird,
nicht relativ zum Ursprung des Frames..,

besser wäre es, ganz auf das Label zu verzichten und auf einem reinen JPanel mit drawImage an der richtigen Position zu arbeiten,
dann kann der MouseListener das ganze JPanel umfassen

---------

ich weiß auch nicht ob das so wie ich es gebaut habe ideal ist,
aber geht erstmal ;)

Code:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JComponent;

public class Mausi extends MouseAdapter implements MouseMotionListener {

	private int startx;
	private int starty;
	private JComponent c = null;

	public void mouseEntered(MouseEvent e) {
		c = (JComponent) e.getSource();
	}
	public void mousePressed(MouseEvent e) {
		System.out.println("1: " + e.getX() + "  " + e.getY());
		startx = e.getX();
		starty = e.getY();
	}
	public void mouseReleased(MouseEvent e) {
		System.out.println("2: " + e.getX() + "  " + e.getY());
		//setPosition(e);
	}

	public void mouseDragged(MouseEvent e) {
		System.out.println("4: " + e.getX() + "  " + e.getY());
		setPosition(e);
	}

	private void setPosition(MouseEvent e) {
		int neux = c.getLocation().x + e.getX() - startx;
		int neuy = c.getLocation().y + e.getY() - starty;
		c.setLocation(neux, neuy);
	}

	public void mouseMoved(MouseEvent e) {
	}
}

-----------


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.dnd.DragSource;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.TransferHandler;

public class TestDrag extends JComponent {

	public JFrame frame = new JFrame("TestDrag");
	public ImageIcon ico = new ImageIcon("BACKGROUND.GIF");
	public JLabel componentType = new JLabel(ico);

	public TestDrag() {
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(this, BorderLayout.CENTER);
		componentType.setBackground(new Color(0, 0, 0));
		componentType.setSize(31, 31);
		componentType.setLocation(0, 0);
		componentType.setBorder(BorderFactory.createLineBorder(Color.GREEN));
		frame.getContentPane().setLayout(null);
		frame.getContentPane().add(componentType, null);

		frame.setSize(400, 400);
		frame.setVisible(true);

		componentType.setTransferHandler(new TransferHandler("text"));
		frame.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				System.out.println(e.getX() + "  " + e.getY());
				//JComponent c = (JComponent)e.getSource();
				componentType.setLocation(e.getX(), e.getY());
			}
		});

		Mausi mausi = new Mausi();
		componentType.addMouseListener(mausi);
		componentType.addMouseMotionListener(mausi);

	}

	public static void main(String[] args) {
		TestDrag tud = new TestDrag();
	}
}
 
SlaterB hat gesagt.:
vergesse nie
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sonst hast du immer alte Java-Programme, die unsichtbar auf deinem PC weiterlaufen

Ist oke, mache ich sowieso aber ich starte es aus der IDE raus (JDeveloper) und da gibt es so einen netten roten Stop Button damit den Prozess beendet --> trotzdem danke und werde ich nicht vergessen.

SlaterB hat gesagt.:
besser wäre es, ganz auf das Label zu verzichten und auf einem reinen JPanel mit drawImage an der richtigen Position zu arbeiten,
dann kann der MouseListener das ganze JPanel umfassen

Die Variante hört sich nicht schlecht an, aber im eigentlichen Programm arbeite ich auf der Oberfläche mit drei DesktopPanes: In einem befinden sich die Elemente die man auswählen kann (deshalb JLabels) und auf eines der beiden anderen JDesktopPanes zieht. Diese beiden DP's teilen sich die Gesamthöhe und breite, wobei eigentlich nur die Höhe geteilt wird. Auf diesen liegen wiederum jeweils ein JLabel worin die Auswahlelemente positioniert werden. Die DP's müssen jedoch beide aktualisiert werden egal auf welches DP das Element gelegt wird --> das wird auch noch mal eine lustige Herausforderung.

SlaterB hat gesagt.:
ich weiß auch nicht ob das so wie ich es gebaut habe ideal ist,
aber geht erstmal ;)

Es geht und ich danke dir für die Hilfe, egal wie es ist es ist optimal, ich muss das ganze sowieso umbauen damit es nicht nur auf ein Label hört sondern das DP soll den Listener haben und schauen welches Auswahlelement gewählt wird, nur dieses soll dann gezogen werden.

Danke auf jeden Fall.
 
Eine weitere Frage tut sich nun auf. Wenn ich beim oben beschriebenen Code das Element verschiebe, verschiebe ich es Punkt A nach Punkt B. Wenn ich jedoch das Element beim "mousePressed - Event" clonen möchte um das original Element nicht zu bewegen, sondern dessen Klon (sprich ich klicke auf das original Element es wird ein Klon erzeugt und diesen kann ich ziehen wohin ich will) - wie mache ich das mit dem oben vorhanden Code?

Arbeite zum ersten mal mit clone() und leider lässt der Erfolg noch auf sich warten.

lg - a cup of java.
 
S

SlaterB

Gast
ich habe bisher nie mit clone gearbeitet und hatte damit immer Erfolg ;)

auch hier kommt es mit der normalen clone-Operation zu merkwürdigen Fehler,
es wird zwar ein zweites Objekt erstellt, aber nicht beide angezeigt,
vielleicht werden auch irgendwelche Layout-Dinge kopiert..

allgemein zu clone mache besser ein neues Topic auf,
bzw. beschäftige dich nicht mit Dingen die du noch nicht gelernt hast :bae:


hab hierfür nochmal was zur Ansicht gebastelt, aber öfter mache ich das nicht mehr,
also mit myClone() gehts bei mir nicht, mit myClone2() dagegen schon

Code:
import javax.swing.Icon;
import javax.swing.JLabel;

public class MyLabel extends JLabel implements Cloneable {

	public MyLabel(Icon image) {
		super(image);
	}

	public MyLabel myClone() {
		try {
			return (MyLabel) this.clone();
		} catch (CloneNotSupportedException e) {
			System.out.println("CloneNotSupportedException: " + e.getMessage());
			return null;
		}
	}
	public MyLabel myClone2() {
		MyLabel other = new MyLabel(this.getIcon());
		other.setBorder(this.getBorder());
		other.setSize(this.getSize());

		return other;
	}
	
}
------------


import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JComponent;

public class Mausi extends MouseAdapter implements MouseMotionListener {

	private JComponent owner;

	private int startx;
	private int starty;
	private JComponent c = null;

	public Mausi(JComponent owner) {
		this.owner = owner;
	}

	public void mousePressed(MouseEvent e) {
		System.out.println("1: " + e.getX() + "  " + e.getY());

		MyLabel alt = (MyLabel) e.getSource();
		MyLabel neu = alt.myClone2();
		neu.setLocation(alt.getLocation());
		neu.addMouseListener(this);
		neu.addMouseMotionListener(this);
		System.out.println("neu == alt? "+(neu == alt));
		owner.add(neu);
		owner.repaint();
		c = alt;

		startx = e.getX();
		starty = e.getY();

	}
	public void mouseReleased(MouseEvent e) {
		System.out.println("2: " + e.getX() + "  " + e.getY());
		//setPosition(e);
	}

	public void mouseDragged(MouseEvent e) {
		// System.out.println("4: " + e.getX() + "  " + e.getY());
		setPosition(e);
	}

	private void setPosition(MouseEvent e) {
		int neux = c.getLocation().x + e.getX() - startx;
		int neuy = c.getLocation().y + e.getY() - starty;
		c.setLocation(neux, neuy);
	}

	public void mouseMoved(MouseEvent e) {
	}
}
---------


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.dnd.DragSource;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.TransferHandler;

public class TestDrag extends JComponent {

	public JFrame frame = new JFrame("TestDrag");
	public ImageIcon ico = new ImageIcon("BACKGROUND.GIF");
	public JLabel componentType = new MyLabel(ico);

	public TestDrag() {
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(this, BorderLayout.CENTER);
		componentType.setBackground(new Color(0, 0, 0));
		componentType.setSize(31, 31);
		componentType.setLocation(100, 100);
		componentType.setBorder(BorderFactory.createLineBorder(Color.GREEN));

		setLayout(null);
		add(componentType);
		frame.setSize(400, 400);
		frame.setVisible(true);

		componentType.setTransferHandler(new TransferHandler("text"));
		frame.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				System.out.println(e.getX() + "  " + e.getY());
				componentType.setLocation(e.getX() - 15, e.getY() - 35);
			}
		});

		Mausi mausi = new Mausi(this);
		componentType.addMouseListener(mausi);
		componentType.addMouseMotionListener(mausi);

	}

	public static void main(String[] args) {
		TestDrag tud = new TestDrag();
	}
}

zu beachten: wenn man bei mousePressed ein neues Objekt erstellt,
ist es einfacher, das neue dazulassen und das alte zu verschieben,
weil sich das Dragging danach weiter auf das alte Objekt bezieht (e.getSource(), Koordinatenbezugspunkt),

man kann natürlich dennoch das neue verschieben wenn man genügend rechnet,
was muss nur wissen was man tun will
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
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
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
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
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
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 Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
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
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
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
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
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
X Drag and Drop AWT, Swing, JavaFX & SWT 2
F Drag&Drop Jlist -> JList AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben