# JButton dnd



## PollerJava (15. Jan 2008)

Hallo,

ich möchte einen JButton von einem JPanel auf ein anderes JPanel ziehen, Beide JPanels befinden sich auf einem JFrame,
ist das irgendwie möglich bzw. es muss ja nur so aussehen, wie wenn der JButton auf das andere JPanel gezogen wird,

Hintergrund ist der, dass ich wie in NetBeans oder in Eclipse mir eine Oberfläche erzeugen will und daher z.B.: JButtons auf ein anderes JPanel ziehen will,

lg und vielen Dank für die Antworten,


----------



## tuxedo (15. Jan 2008)

Möglich ist alles... Ein fertiges Kochrezept hab ich allerdings nicht. Ließ dich doch mal in's Drag'n'Drop ein.


----------



## PollerJava (15. Jan 2008)

Bin gerade dabei, aber was mich ein bisschen stutzig gemacht hat ist, das es dafür weder auf der Sun- Seite noch sonstwo ein Beispiel mit einem JButton gibt, nur mit Text o.ä.

Ist der Code für Netbeans oder Eclipse nicht irgendwo erhältlich, genau so solls bei mir auch funktionieren,

Vielen dank,

lg


----------



## tuxedo (15. Jan 2008)

Naja, "was" du da herumziehst, ist doch fast schnuppe. 
Ich hab vor 3 Jahren auch mal was gebastelt da hab ich ein JLabel auf dem ich ein Icon liegen hatte herumgezogen (hab das irgendwie über paint() gelöst glaub ich, is schon länger her). Ob's direkt mit einem JButton geht weiß ich nicht. Aber notfalls kannst du ja ein Bildchen vom Button nehmen und das rumziehen. Bein Loslassen wird dann halt an genau der stelle der JButton erstellt.

Geholfen hat mir damals das JavaBuch von Guido Krüger und Google..

- Alex


----------



## PollerJava (16. Jan 2008)

Was halt mir ein bisschen sorgen macht, ist, dass ich z.B.: eben die JButtons "pixelgenau" plazieren können soll, 
Daher muss ich irgendwie den JButton inauf der Maus haben und wenn ich dann die Maus auslasse, dann soll sich der JButton genau dort hin setzen, wo ich ebenb ausgelassen habe,

lg


----------



## tuxedo (16. Jan 2008)

Du stellst dich an. Du kennst doch die koordinaten der Maus? Und du kennst die Abmessungen des Buttons. Und ebenfalls weißt du wo sich der Mauszeigen relativ zur gedraggten Button-Grafik befindet. Mit dem wissen kannst du dann "pixelgenau" das ganze positionieren.

- Alex

p.s. btw: probieren geht über studieren.


----------



## PollerJava (16. Jan 2008)

Ja das ist mir schon klar, das hab ich schon implementiert, wo ich anstehe ist, dass wenn ich rechts den JButton klicke und dann auf mein JPanel ziehe, eben der JButton an der Maus drannhängen soll (oder eben ein Bild von diesem Button)
da hab ich Probleme, da ich nicht weiß, wie ich das an den Mauszeiger anhängen soll,

lg


----------



## tuxedo (16. Jan 2008)

Ich schau mal ob ich meinen uralten Code noch finde... War zwar quick'n'dirty, aber vielleicht kannst du was mit anfangen.


----------



## tuxedo (16. Jan 2008)

Nö, hab ich leider doch nicht mehr. Aber ich erinner mich wie ich das gemacht hab:

Hatte eins von diesen Beispiel hier benutzt:

http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html

Problem war, dass ich nur sowas hier 
	

	
	
		
		

		
			





 angezeigt bekommen hab. Soweit dürftest du bis jetzt auch sein...

Okay, ich hab dann ein durchsichtiges JPanel über _alles_ drüber gelegt und hab in dem Panel nen MouseListener eingebaut. Jedesmal wenn ich also mein "dragging" mit der maus begonnen hab, hat's in dem Panel ein mousePressed() event ausgelöst. Ich hab dort dann geschaut ib's auch wirklich eine Drag'n'Drop Aktion ist und hab dann an exakt die Stelle in diesem durchsichtigen JPanel das Bildchen "gemalt" (paint hatte ich dort überschrieben), wo sich die Maus befindet. Und wenn ich die Maus losgelassen hab, hab ich das Panel einfach wieder "geleert". Fertig. War recht easy.

- Alex


----------



## PollerJava (16. Jan 2008)

Vielen Dank für die Hilfe!! Die Seite oben hab ich mir eh auch schon durchgelesen, mal schau, ob ich weiter komm,

Vielen dank,


----------



## PollerJava (16. Jan 2008)

Und das Bildchen hast du irgendwo auf dem JFrame gehabt? Ich frag mich nämlich gerade, wo ich so ein Bildchen von meinem JButton hernehmen könnte,
Am Besten wärs, wenn ich einen ScreenShot von dem JButton machen könnte, weil ich 

1. den JButton von meinem DockingFrame "Prperties" in den "working- DockingFrame" ziehe und 
2. im "working- DockingFrame den JButton bearbeite (größer, kleiner, farbe ändere usw.) und eben im "working- Frame auch wieder umherziehen (Pixelgenau plazieren) will,

lg


----------



## tuxedo (16. Jan 2008)

ich hab nix von nem JFrame gesagt... Prinzipiell ist es egal ob JFrame oder JInternalFrame oder sonstwas. Letztendlich arbeitest du im normalfall mit JPanels. 

Und da hab ich auf einem extra, über allem liegenden, JPanel das Bildchen gezeichnet und immer an die aktuelle Mausposition verschoben wenn ich Drag'n'drop gemacht hab. Dazu hab ich glaub ich das Bildchen als ImageIcon auf ein JLabel gelegt und das im Transparenten JPanel herumgeschoben. So irgendwie.

Wo du das Bildchen hernimmst ist deine Sache. Sei halt kreativ. 

- Alex


----------



## PollerJava (16. Jan 2008)

Ich hab mir das Programm unten geschrieben, komm aber nicht drauf, wie ich den JButton auf einem JPanel verschieben kann, wohin ich will, 
könnte mir da jemand helfen?

Vielen Dank,
lg
	
	
	
	





```
package com.com;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.awt.dnd.*;
import javax.swing.*;
 
public class Transfer extends JPanel implements DragGestureListener, DragSourceListener, DropTargetListener, Transferable
{
	protected JPanel source = new JPanel();
	protected JPanel target = new JPanel();
	protected Button button = new Button("Drag this button");	    
	protected Object object;
        protected JPanel mainPanel = new JPanel();
        static final DataFlavor[] supportedFlavors = { null }; 
             
        public Transfer ()
            {   
            mainPanel.setLayout(new BorderLayout());
            source.setLayout(null);
            button.setBounds(10,10,130, 60);
            source.add(button);          
            source.setPreferredSize(new Dimension(300,600));        
            target.setLayout(null);
            target.setPreferredSize(new Dimension(300,600));  
            mainPanel.add(source, BorderLayout.EAST);
            mainPanel.add(target, BorderLayout.WEST);  
            source.setBounds(0, 200, 200, 200);
            target.setBounds(220, 200, 200, 200);
            add(mainPanel);                
            DragSource dragSource = new DragSource();
            DropTarget dropTarget1 = new DropTarget(source, DnDConstants.ACTION_COPY, this);
            DropTarget dropTarget2 = new DropTarget(target, DnDConstants.ACTION_COPY, this);
            DragGestureRecognizer dragRecognizer1 = dragSource.createDefaultDragGestureRecognizer(button, DnDConstants.ACTION_COPY, this);               		     		
            }         
        static
            {
            try { supportedFlavors[0] = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType); }
            catch (Exception ex) { ex.printStackTrace(); }
            } 
    public Object getTransferData(DataFlavor flavor){ if (flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType)) return object; else return null;}
    public DataFlavor[] getTransferDataFlavors() { return supportedFlavors; }
    public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType); }
    public void dragGestureRecognized(DragGestureEvent ev){ev.startDrag(null, this, this);}
    public void dragDropEnd(DragSourceDropEvent ev) { }
    public void dragEnter(DragSourceDragEvent ev) { }
    public void dragExit(DragSourceEvent ev) { }
    public void dragOver(DragSourceDragEvent ev) { object = ev.getSource(); }
    public void dropActionChanged(DragSourceDragEvent ev) { } 
    public void dragEnter(DropTargetDragEvent ev) { }
    public void dragExit(DropTargetEvent ev)      { }
    public void dragOver(DropTargetDragEvent ev)  { dropTargetDrag(ev); }
    public void dropActionChanged(DropTargetDragEvent ev) { dropTargetDrag(ev); }
    void dropTargetDrag(DropTargetDragEvent ev) { ev.acceptDrag(ev.getDropAction()); }
 
    public void drop(DropTargetDropEvent ev)
        {
        System.out.println("Methode drop wird aufgerufen");
        ev.acceptDrop(ev.getDropAction());
        try
            {
            Object target = ev.getSource();
            Object source = ev.getTransferable().getTransferData(supportedFlavors[0]);
            Component component = ((DragSourceContext) source).getComponent();
            Container oldContainer = component.getParent();
            oldContainer.setLayout(null);
            Container container = (Container) ((DropTarget) target).getComponent();
            container.setLayout(null);
            container.add(component);
            //oldContainer.validate();
            oldContainer.repaint();
            //container.validate();
            container.repaint();
            }
        catch (Exception ex) { ex.printStackTrace(); }
        ev.dropComplete(true);
       }
    
    public static void main(String[] args) {
	Transfer dm = new Transfer ();
	JFrame frame = new JFrame(); 
	frame.getContentPane().add(dm);	
        frame.setBounds(10,10,700, 700);
	frame.setVisible(true);
	}
 }
```


----------



## PollerJava (16. Jan 2008)

Hat da jemand noch eine Idee, wie das gehen könnte?

lg


----------



## tuxedo (17. Jan 2008)

Das blickt ja kein schwein mehr... Ein paar Comments sind immer hilfreich...

Hab das ganze mal eben in 15min selbst gebaut, ohne irgendwas "durchzulesen" .. Einfach try&error und ein wenig Verstand.


```
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Transfer extends JPanel {
	
	
	
	JPanel elementPanel = new JPanel();
	JPanel dragPaintPanel = new JPanel();
	JButton button = new JButton("Hallo Welt");
	
	boolean currentlyDragging = false;

	public Transfer() {
		// absolutes Layout. Mit anderen Layouts wird's vermutlich wesentlich aufwendiger
		this.setLayout(null);
		
		elementPanel.setLayout(null);
		elementPanel.setOpaque(true);	// transparent
		elementPanel.setFocusable(false);	// nicht fokusierbar
		
		dragPaintPanel.setLayout(null);
		dragPaintPanel.setOpaque(true);	// transparent
		dragPaintPanel.setFocusable(false);	// nicht fokusierbar
		
		// beide Panels auf die gleiche Größe und Position bringen
		elementPanel.setBounds(0, 0, 800, 600);
		dragPaintPanel.setBounds(0, 0, 800, 600);
		
		// Button basteln
		button.setBounds(100, 100, 150, 21);
		button.setName("meinButton");
		
		// Visuelle Elemente hinzufügen
		elementPanel.add(button);
		
		
		
		
		dragPaintPanel.addMouseMotionListener(new MouseMotionListener(){
			
			public void mouseDragged(MouseEvent e) {
				
				System.out.println("Drag: "+e.getX()+"/"+e.getY());
				
				// schauen was denn da liegt wo wir versuchen zu draggen ...
				JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
				
				// Erstmal nur "JButtons" akzeptieren ....
				if (component instanceof JButton){
					System.out.println("Verschiebe: "+component.getName());
					
					// Die Komponente so positionieren, dasss der Mauszeiger immer in der Mitte ist
					component.setLocation(e.getX()-(component.getWidth()/2), e.getY()-(component.getHeight()/2));
					System.out.println(component.getName()+" now at x="+component.getBounds().x+" y="+component.getBounds().y);
					
					
				}
				
				System.out.println();
				
			}

			public void mouseMoved(MouseEvent e) {
				System.out.println("Move: "+e.getX()+"/"+e.getY());
				JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
				if (component instanceof JButton){
					System.out.println("... over: "+component.getName());
				}
				System.out.println();
			}
			
		});
		
		// Die Einfügereihenfolge ist wichtig... Sonst ist der Button "klickbar". Aber wir wollen
		// ihn ja nicht anklicken, sondern verschieben können.... Offensichtlich liegt das "zuletzt"
		// eingefügte Element "unten" .. Das was "oben" liegen soll, muss also als erstes rein.
		this.add(dragPaintPanel);
		this.add(elementPanel);
		
		
		
	}

	
	
	
	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		
		frame.getContentPane().add(new Transfer());
		frame.setSize(800,600);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	
}
```

Known Bugs:

* Bewegt man die Maus beim draggen zu schnell, "verlässt" man den Einzugsbereich der Komponente und man hört auf sie zu verschieben. 
* Habs nicht mit mehreren Komponenten getestet. Aber es könnt in der aktuellen implementierung sehr gut sein, dass das ganz gewaltig durcheinander gerät wenn man einen Button über einen anderen hinweg zieht.

Man müsste noch was einbauen mit dem man sich merkt "was" gerade gedragged wird und von da an, bis zum loslassen der maus _nicht mehr_ prüft was "drunter" liegt, sondern exakt das weiterverschiebt was man eh gerade schon schiebt.

- Alex


----------



## PollerJava (17. Jan 2008)

Vielen Dank, 
eigentlich hast Du recht, warum das ganze mir D&D wenns so auch geht, 
es hat nur das D&D bei mir sehr gut funktioniert bis eben auf das "vervielfältigen",

Auf jeden Fall vielen Dank für Deine 15 min!!!!!

lg


----------



## tuxedo (17. Jan 2008)

Die Rechunng kommt dann postwendend .. *g*


----------



## PollerJava (17. Jan 2008)

Hoffe auf Rabatt bzw. Kostenvoranschlag 

lg


----------



## lhein (17. Jan 2008)

Einen Kostenvoranschlag macht man eigentlich bevor man einen Auftrag erteilt. Sonst trägst Du logischerweise alle Kosten in der entstandenen Höhe.


----------



## PollerJava (17. Jan 2008)

schon klar, sollte nur ein witzchen sein,


----------



## PollerJava (17. Jan 2008)

Alex, funkt. dein Beispiel auch wenn ich nur ein JPanel habe, ich verwende nämlich ein DefaultDockable pV = new DefaultDockable(); und da 2 JPanel übereinander zu plazieren war mir bis jetzt nicht möglich,

geht das irgendwie ohne 2 Panel?

lg


----------



## tuxedo (17. Jan 2008)

Sollte eigentlich gehen. Du kannst ja alles nach belieben verschachteln. Mach halt in dein Dockable ein "Master" JPanel mit Null-Layout und füge da dann meine zwei Panels ein. 

Im übrigen ist meine Lösung sicher nicht das absolute und wahre. Da kann man sicher noch einiges verbessern. Aber in 15min "from scratch" war nicht mehr drin. Muss ja nebenbei noch Geld verdienen ;-)

- Alex


----------



## PollerJava (17. Jan 2008)

Mein Problem ist ja auch, dass ich nicht alles setOpaque(true) machen kann, da ich im Hintergrund ein Bild habe und dieses nicht gelöcht werden darf, dass ist aber der Fall, wenn die 2 Panels übereinander nicht Durchsichtig sind,

Wisst ihr da eine Lösung?

lg


----------



## tuxedo (17. Jan 2008)

Sorry, Fehler vom Amt. Verwechlse das _immer_.
In Zeile 25 und 29 sollte es natürlich "false" heißen. Sieht man auch am Kommentar. 

Mit ein wenig Hirnschmalz, oder wenn der nicht ausreicht, try&error, hättest du auch selbst drauf kommen können ;-) --> Mitdenken und nicht nur einfach blind kopieren....

Ein guter Softwareentwickler kopiert nicht nur (sofern er das überhaupt darf), er schaut "wie's" gemacht wird und versucht zu verstehen. Das ist genau das, was dir offensichtlich (merkt man wenn man hier im Forum etwas länger unterwegs ist) noch fehlt ;-)

- Alex


----------



## tuxedo (17. Jan 2008)

Weils mich jetzt selber "gefuchst" hat und ich das vielleicht auch nochmal selbst brauchen kann, hab ich's mal "erweitert" so dass es jetzt auch mit schnellen Mausbewegungen klappt (er merkt sich das zu draggende Element bis die Maustaste losgelassen wird). Auch dürfte es jetzt keine Probleme mit dem "über anderen Elemente hinwegschieben" geben.


```
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Transfer extends JPanel {
	
	
	
	JPanel elementPanel = new JPanel();
	JPanel dragPaintPanel = new JPanel();
	JComponent currentDraggingElement = null;
	
	JButton button = new JButton("Hallo Welt");
	

	public Transfer() {
		// absolutes Layout. Mit anderen Layouts wird's vermutlich wesentlich aufwendiger
		this.setLayout(null);
		
		elementPanel.setLayout(null);
		elementPanel.setOpaque(false);	// transparent
		elementPanel.setFocusable(false);	// nicht fokusierbar
		
		dragPaintPanel.setLayout(null);
		dragPaintPanel.setOpaque(false);	// transparent
		dragPaintPanel.setFocusable(false);	// nicht fokusierbar
		
		// beide Panels auf die gleiche Größe und Position bringen
		elementPanel.setBounds(0, 0, 800, 600);
		dragPaintPanel.setBounds(0, 0, 800, 600);
		
		// Button basteln
		button.setBounds(100, 100, 150, 21);
		button.setName("meinButton");
		
		// Visuelle Elemente hinzufügen
		elementPanel.add(button);
		
		dragPaintPanel.addMouseMotionListener(new MouseMotionListener(){
			
			public void mouseDragged(MouseEvent e) {
				
				System.out.println("Drag: "+e.getX()+"/"+e.getY());
				
				if (currentDraggingElement==null){
				
					// schauen was denn da liegt wo wir versuchen zu draggen ...
					JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
					
					// Erstmal nur "JButtons" akzeptieren ....
					if (component instanceof JButton){
						
						currentDraggingElement = component;
						
					} 
					
				} else {
					System.out.println("Verschiebe: "+currentDraggingElement.getName());
					
					// Die Komponente so positionieren, dasss der Mauszeiger immer in der Mitte ist
					currentDraggingElement.setLocation(e.getX()-(currentDraggingElement.getWidth()/2), e.getY()-(currentDraggingElement.getHeight()/2));
					System.out.println(currentDraggingElement.getName()+" now at x="+currentDraggingElement.getBounds().x+" y="+currentDraggingElement.getBounds().y);
				}
				
				System.out.println();
				
			}

			public void mouseMoved(MouseEvent e) {
				System.out.println("Move: "+e.getX()+"/"+e.getY());
				JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
				if (component instanceof JButton){
					System.out.println("... over: "+component.getName());
				}
				System.out.println();
			}
			
		});
		
		dragPaintPanel.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseReleased(MouseEvent e) {
				currentDraggingElement=null;
			}
			
		});
		
		// Die Einfügereihenfolge ist wichtig... Sonst ist der Button "klickbar". Aber wir wollen
		// ihn ja nicht anklicken, sondern verschieben können.... Offensichtlich liegt das "zuletzt"
		// eingefügte Element "unten" .. Das was "oben" liegen soll, muss also als erstes rein.
		this.add(dragPaintPanel);
		this.add(elementPanel);
		
		
		
	}

	
	
	
	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		
		frame.getContentPane().add(new Transfer());
		frame.setSize(800,600);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	
}
```


----------



## PollerJava (17. Jan 2008)

Du wirst es kaum glauben, aber das habe ich schon vor deinem Post ausgebessert setOpaque(false) = durchsichtig,
hätte mir auch passieren können 

so weit es mir möglich ist, kontrolliere ich den Code auf jeden fall,

ld und Danke für Deine Hilfe,


PS:
funktioniert super!!!!


----------



## PollerJava (18. Jan 2008)

Morgen,

wenn ich auf dem JPanel 2 JButton habe, ist es da irgendwie möglich, wenn ich einen Jbutton anklicke, dass dieser irgendwie gekennzeichnet ist als angewählt und wenn ich den anderen anklicke, dass dann eben der andere als angeklickt makiert ist,
muss ich mir das ausprogrammieren oder geht das irgendwie über den Focus?

Vielen Dank,

lg


----------



## tuxedo (18. Jan 2008)

Hmm... In zeile 54 holst du dir ja das "unter dem Mauszeiger liegende Element". 

Dieses Element kannst du dann nach seiner Hintergrundfarbe fragen und diese speichern. Während des draggens setzt du das dann beispielsweise auf "rot", und nach dem draggen wieder zurück auf die Ausgangsfarbe.


```
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DnDJButtonOnJPanel extends JPanel {
	
	
	
	JPanel elementPanel = new JPanel();
	JPanel dragPaintPanel = new JPanel();
	JComponent currentDraggingElement = null;
	
	JButton button = new JButton("Hallo Welt");
	protected Color originBgColor;
	

	public DnDJButtonOnJPanel() {
		// absolutes Layout. Mit anderen Layouts wird's vermutlich wesentlich aufwendiger
		this.setLayout(null);
		
		elementPanel.setLayout(null);
		elementPanel.setOpaque(false);	// transparent
		elementPanel.setFocusable(false);	// nicht fokusierbar
		
		dragPaintPanel.setLayout(null);
		dragPaintPanel.setOpaque(false);	// transparent
		dragPaintPanel.setFocusable(false);	// nicht fokusierbar
		
		// beide Panels auf die gleiche Größe und Position bringen
		elementPanel.setBounds(0, 0, 800, 600);
		dragPaintPanel.setBounds(0, 0, 800, 600);
		
		// Button basteln
		button.setBounds(100, 100, 150, 21);
		button.setName("meinButton");
		
		// Visuelle Elemente hinzufügen
		elementPanel.add(button);
		
		dragPaintPanel.addMouseMotionListener(new MouseMotionListener(){
			
			public void mouseDragged(MouseEvent e) {
				
				System.out.println("Drag: "+e.getX()+"/"+e.getY());
				
				if (currentDraggingElement==null){
				
					// schauen was denn da liegt wo wir versuchen zu draggen ...
					JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
					
					// Erstmal nur "JButtons" akzeptieren ....
					if (component instanceof JButton){
						originBgColor = component.getBackground();
						component.setBackground(Color.red);
						currentDraggingElement = component;
						
					} 
					
				} else {
					System.out.println("Verschiebe: "+currentDraggingElement.getName());
					
					// Die Komponente so positionieren, dasss der Mauszeiger immer in der Mitte ist
					currentDraggingElement.setLocation(e.getX()-(currentDraggingElement.getWidth()/2), e.getY()-(currentDraggingElement.getHeight()/2));
					System.out.println(currentDraggingElement.getName()+" now at x="+currentDraggingElement.getBounds().x+" y="+currentDraggingElement.getBounds().y);
				}
				
				System.out.println();
				
			}

			public void mouseMoved(MouseEvent e) {
				System.out.println("Move: "+e.getX()+"/"+e.getY());
				JComponent component = (JComponent) elementPanel.getComponentAt(e.getX(), e.getY());
				if (component instanceof JButton){
					System.out.println("... over: "+component.getName());
				}
				System.out.println();
			}
			
		});
		
		dragPaintPanel.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void mouseReleased(MouseEvent e) {
				if (currentDraggingElement != null){
					currentDraggingElement.setBackground(originBgColor);
				}
				currentDraggingElement=null;
			}
			
		});
		
		// Die Einfügereihenfolge ist wichtig... Sonst ist der Button "klickbar". Aber wir wollen
		// ihn ja nicht anklicken, sondern verschieben können.... Offensichtlich liegt das "zuletzt"
		// eingefügte Element "unten" .. Das was "oben" liegen soll, muss also als erstes rein.
		this.add(dragPaintPanel);
		this.add(elementPanel);
		
		
		
	}

	
	
	
	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		
		frame.getContentPane().add(new DnDJButtonOnJPanel());
		frame.setSize(800,600);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	
}
```


----------



## PollerJava (18. Jan 2008)

So in die Richtung hab ich jetzt auch gedacht, 
Mein Plan war ja, dass ich z.B.: einen JButton mit der Maus makiere (der JButton bleibt dann makiert) und dann z.B.: mit der "ENTF"- Taste wieder entfernen kann,

Ich hab aber jetzt umgeschwenkt und mir ein PopupMenü gemacht, das angezeigt werden kann, wenn ich über einen JButton bin und wenn ich im PopupMenü "Löschen" klicke, dann wird der JButton gelöscht,

Vielen Dank,


----------



## tuxedo (18. Jan 2008)

Ja, is wohl die bessere/intuitivere Lösung.


----------

