Hallo miteinander, ich plage mich seit Wochen mit einem Java Drag and Drop Problem, und hoffe das ihr mit weiterhelfen könnt.
Was mein Ziel seien soll:
Ich möchte gerne ein kleines Programm entwickeln mit dem ich mittels Drag and Drop verschiedene Java-Objekte eines bestimmten Typs erzeugen und in einem GridLayout Positionieren kann. (Diese Objekte stammen alle von verschiedenen Swingobjekten wie z.B. JButton ab)
Sprich ich hätte gern eine Art Menü in dem die verschiedenen Objekte enthalten sind welche ich dann auf mein JPanel ziehen kann. Vorzugsweise sollte nun dieses Objekt dort erstellt werden, mein Ziel ist jedoch ausserdem das ich dieses Objekt wenn ich es zurück auf das Menu ziehe wieder gelöscht wird.
Soweit zu meinem Ziel.
Jedoch scheitert es bei mir schon beim lediglichen Drag and Drop an einer Wissenslücke welche ich auch mit Google und der Forumsuche hier nicht ganz in den Griff bekomme. Anbei mal ein einfacher Codeauszug in dem ich Versuche lediglich einen JButton von A nach B zu bewegen/kopieren.
Das DragObject ist lediglich eine erweiterung eines JButtons, wie oben beschrieben:
Mein DebugDropListener schaut wie folgt aus:
Ich hoffe ihr könnt mir helfen, danke schoneinmal an der Stelle!
Grüße
jan
Was mein Ziel seien soll:
Ich möchte gerne ein kleines Programm entwickeln mit dem ich mittels Drag and Drop verschiedene Java-Objekte eines bestimmten Typs erzeugen und in einem GridLayout Positionieren kann. (Diese Objekte stammen alle von verschiedenen Swingobjekten wie z.B. JButton ab)
Sprich ich hätte gern eine Art Menü in dem die verschiedenen Objekte enthalten sind welche ich dann auf mein JPanel ziehen kann. Vorzugsweise sollte nun dieses Objekt dort erstellt werden, mein Ziel ist jedoch ausserdem das ich dieses Objekt wenn ich es zurück auf das Menu ziehe wieder gelöscht wird.
Soweit zu meinem Ziel.
Jedoch scheitert es bei mir schon beim lediglichen Drag and Drop an einer Wissenslücke welche ich auch mit Google und der Forumsuche hier nicht ganz in den Griff bekomme. Anbei mal ein einfacher Codeauszug in dem ich Versuche lediglich einen JButton von A nach B zu bewegen/kopieren.
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class dnd extends JFrame implements DragSourceListener, DragGestureListener {
DropTarget dt;
DragSource ds;
public dnd(){
super("test");
setLayout(new BorderLayout());
setSize(600,600);
JPanel target = new JPanel();
target.setBorder(new LineBorder(Color.black));
dt = new DropTarget(target, new DebugDropListener());
ds = new DragSource();
DragObject test = new DragObject();
DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(test, DnDConstants.ACTION_COPY, this);
add(test,BorderLayout.NORTH);
add(target,BorderLayout.CENTER);
setVisible(true);
}
public void dragGestureRecognized(DragGestureEvent dge){
System.out.println("Drag detected");
//Transferable t = new StringSelection("aString");// da fehlts..
//ds.startDrag (dge, DragSource.DefaultCopyDrop, t, this);
// hier fehlt das wissen...dge.startdrag(xxxxxx);
}
public static void main(String Args[])
{
dnd x = new dnd();
}
public void dragDropEnd(DragSourceDropEvent dsde) {
// TODO Auto-generated method stub
System.out.println("End");
}
public void dragEnter(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
System.out.println("Enter");
}
public void dragExit(DragSourceEvent dse) {
// TODO Auto-generated method stub
System.out.println("Exit");
}
public void dragOver(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
System.out.println("Over");
}
public void dropActionChanged(DragSourceDragEvent dsde) {
// TODO Auto-generated method stub
System.out.println("Changed");
}
}
Das DragObject ist lediglich eine erweiterung eines JButtons, wie oben beschrieben:
Code:
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import javax.swing.JButton;
public class DragObject extends JButton {
public DragObject() {
this.setText("Button");
// TODO Auto-generated constructor stub
}
}
Mein DebugDropListener schaut wie folgt aus:
Code:
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
public class DebugDropListener implements DropTargetListener{
public void dragEnter(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
System.out.println("Enter");
}
public void dragExit(DropTargetEvent dte) {
// TODO Auto-generated method stub
System.out.println("Exit");
}
public void dragOver(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
System.out.println("Over");
}
public void drop(DropTargetDropEvent de )
{
try {
Transferable t = de.getTransferable();
System.out.println("gedropped");
if (t.isDataFlavorSupported( new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType ) )) {
de.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
DragObject o = (DragObject)t.getTransferData( new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType ) );
de.getDropTargetContext().dropComplete(true);
//Methode welche Objekt O an einer gewissen stelle einfügt(o, de.getLocation() );
} else {
de.rejectDrop();
}
} catch (IOException e) {
de.rejectDrop();
} catch (UnsupportedFlavorException e) {
de.rejectDrop();
} catch ( ClassNotFoundException ce ){
de.rejectDrop();
}
}
public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
System.out.println("Blubb");
}
public Object getTransferData(DataFlavor arg0) throws UnsupportedFlavorException, IOException {
return this;
}
public DataFlavor[] getTransferDataFlavors()
{
try {
DataFlavor[] df = { new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType ) };
return df;
}
catch ( ClassNotFoundException ce ){}
return null;
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
for( DataFlavor d : getTransferDataFlavors() )
{
if( d.equals(flavor) )
return true;
}
return false;
}
}
Ich hoffe ihr könnt mir helfen, danke schoneinmal an der Stelle!
Grüße
jan