Hallo zusammen,
nachdem ich einige Zeit gegoogelt und auch in diesem Forum geblättert habe, ist es mir gelungen ein Drag und Drop mit dragGestureRecognized aufzubauen (ein funktionierendes DnD mit eigenem TransferHandler wäre der nächste Schritt).
Das Transfer-Objekt ist kein Standard Objekt, sondern ein selbstgebautes JPanel mit JTextField, JLabel+Icon und einer JCheckBox.
Hier erstmal das kleine KSKB (naja, es sind fünf Klassen)
Das Panel das per DnD verschoben werden soll:
Das passende Transferable dazu:
Das Quellframe zum draggen:
Das Zielframe zum droppen:
Und schliesslich ein DropObject in Korrespondenz mit dem DropFrame:
Nun meine Fragen:
1. Wie kann ich beim droppen die Mausposition im DropFrame feststellen?
2. Wie wird festgestellt, ob ich verschieben (STRG-Taste) oder kopieren (keine Metataste) will?
3. Wie bekommt dea DragFrame mitgeteilt, das es beim verschieben aktiv werden muss (Object löschen).
Bin über jede konstruktive Hilfe dankbar.
Grüss Max
nachdem ich einige Zeit gegoogelt und auch in diesem Forum geblättert habe, ist es mir gelungen ein Drag und Drop mit dragGestureRecognized aufzubauen (ein funktionierendes DnD mit eigenem TransferHandler wäre der nächste Schritt).
Das Transfer-Objekt ist kein Standard Objekt, sondern ein selbstgebautes JPanel mit JTextField, JLabel+Icon und einer JCheckBox.
Hier erstmal das kleine KSKB (naja, es sind fünf Klassen)
Das Panel das per DnD verschoben werden soll:
Code:
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;
public class MovePanel extends JPanel implements DragGestureListener, DragSourceListener{
JTextField textField = new JTextField();
JLabel imageLabel = new JLabel();
JCheckBox checkbox = new JCheckBox("Check Box" ,true);
int id;
String string;
Color color;
private DragSource dragSource;
//------------------------------------------------------------------------------------------------
public MovePanel(String s, Color c, int x, int y, int i){
string = s;
color = c;
id = i;
setLayout(null);
setLocation(x, y);
setSize(180,160);
setBackground(Color.WHITE);
setBorder(new LineBorder(Color.black));
imageLabel.setBounds(10,10,160,120);
imageLabel.setIcon(new ImageIcon(createImage(string, color)));
textField.setText(string);
textField.setBounds(10,137,100,19);
checkbox.setBounds(142,137,18,19);
add(imageLabel);
add(textField);
add(checkbox);
dragSource = new DragSource();
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
}
//------------------------------------------------------------------------------------------------
public void setMovePanelLocation(int x,int y){
setLocation(x,y);
}
//------------------------------------------------------------------------------------------------
public void dragGestureRecognized(DragGestureEvent dge){
Transferable t = new PanelTransferable(this);
dragSource.startDrag(dge, DragSource.DefaultCopyDrop, t, this);
}
//------------------------------------------------------------------------------------------------
public void dragEnter(DragSourceDragEvent dsde){}
//------------------------------------------------------------------------------------------------
public void dragOver(DragSourceDragEvent dsde){}
//------------------------------------------------------------------------------------------------
public void dropActionChanged(DragSourceDragEvent dsde){}
//------------------------------------------------------------------------------------------------
public void dragDropEnd(DragSourceDropEvent dsde) {}
//------------------------------------------------------------------------------------------------
public void dragExit(DragSourceEvent dsde) {}
//------------------------------------------------------------------------------------------------
public BufferedImage createImage(String s, Color c){
BufferedImage bufferedImage = new BufferedImage(162, 120, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = bufferedImage.createGraphics();
g.setColor(c);
g.fillRect(0,0,160,120);
g.setColor(Color.BLUE);
g.drawString(s, 10,20);
return bufferedImage;
}
//------------------------------------------------------------------------------------------------
}
Das passende Transferable dazu:
Code:
import java.awt.datatransfer.*;
import java.io.*;
//http://www.java2s.com/Code/Java/Swing-JFC/JLabelDragSource.htm
class PanelTransferable implements Transferable {
MovePanel movePanel;
public static final DataFlavor panelFlavor = new DataFlavor(MovePanel.class, "Move Panel");
private static final DataFlavor[] flavors = new DataFlavor[] {
panelFlavor
};
//------------------------------------------------------------------------------------------------
public PanelTransferable(MovePanel m) {
this.movePanel = m;
}
//------------------------------------------------------------------------------------------------
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
//------------------------------------------------------------------------------------------------
public boolean isDataFlavorSupported(DataFlavor fl) {
for (int i = 0; i < flavors.length; i++) {
if (fl.equals(flavors[i])) {
return true;
}
}
System.out.println("no Flavor");
return false;
}
//------------------------------------------------------------------------------------------------
public Object getTransferData(DataFlavor fl) {
if (!isDataFlavorSupported(fl)) {
return null;
}
if (fl.equals(panelFlavor)) {
return movePanel;
}
else{
return null;
}
}
//------------------------------------------------------------------------------------------------
}
Das Quellframe zum draggen:
Code:
import java.awt.*;
import javax.swing.*;
//http://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/69.html
public class DragFrame extends JFrame{
MovePanel myPanel01 = new MovePanel("Eins", Color.red,10,10,1);
MovePanel myPanel02 = new MovePanel("Zwei", Color.green,200,10,2);
//------------------------------------------------------------------------------------------------
public DragFrame(){
super("Drag Frame");
setLayout(null);
add(myPanel01);
add(myPanel02);
}
//------------------------------------------------------------------------------------------------
//Diese Methode aufrufen, wenn MOVE - siehe Frage 3
public void rmPanel(){
// do something
}
//------------------------------------------------------------------------------------------------
public static void main(String args[]){
DragFrame app = new DragFrame();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setBounds(10,10,400,260);
app.setVisible(true);
}
//------------------------------------------------------------------------------------------------
}
Das Zielframe zum droppen:
Code:
import java.awt.dnd.*;
import javax.swing.*;
public class DropFrame extends JFrame{
DropTarget target = new DropTarget(this, new DropObject(this));
//------------------------------------------------------------------------------------------------
public DropFrame(){
super("Drop Frame");
this.setLayout(null);
setDropTarget(target);
}
//------------------------------------------------------------------------------------------------
public void setPanel(MovePanel m){
MovePanel movePanel = m;
// hier Mouseposition ermitteln - siehe Frage 1
//movePanel.setMovePanelLocation(10,30);
add(movePanel);
repaint();
}
//------------------------------------------------------------------------------------------------
public static void main(String args[]){
DropFrame app = new DropFrame();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setBounds(420,10,400,260);
app.setVisible(true);
}
//------------------------------------------------------------------------------------------------
}
Und schliesslich ein DropObject in Korrespondenz mit dem DropFrame:
Code:
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
import javax.swing.*;
public class DropObject extends DropTargetAdapter{
DropFrame dropFrame;
public static final DataFlavor panelFlavor = new DataFlavor(MovePanel.class, "Move Panel");
private static final DataFlavor[] flavors = new DataFlavor[] {
panelFlavor
};
//------------------------------------------------------------------------------------------------
public DropObject(DropFrame d){
dropFrame = d;
}
//------------------------------------------------------------------------------------------------
public void drop(DropTargetDropEvent dtde) {
Transferable transferable = dtde.getTransferable();
dtde.acceptDrop(DnDConstants.ACTION_COPY);
if(dtde.isDataFlavorSupported(panelFlavor)){
try {
MovePanel movePanel = (MovePanel)transferable.getTransferData(panelFlavor);
dropFrame.setPanel(movePanel);
}
catch (UnsupportedFlavorException e) {
JOptionPane.showMessageDialog(null,e.getMessage(),"Information",JOptionPane.INFORMATION_MESSAGE);
}
catch (IOException e) {
JOptionPane.showMessageDialog(null,e.getMessage(),"Information",JOptionPane.INFORMATION_MESSAGE);
}
}
}
//------------------------------------------------------------------------------------------------
}
Nun meine Fragen:
1. Wie kann ich beim droppen die Mausposition im DropFrame feststellen?
2. Wie wird festgestellt, ob ich verschieben (STRG-Taste) oder kopieren (keine Metataste) will?
3. Wie bekommt dea DragFrame mitgeteilt, das es beim verschieben aktiv werden muss (Object löschen).
Bin über jede konstruktive Hilfe dankbar.
Grüss Max