SSISO Community

시소당

JLabel Drag Source

import  java.awt.Font;
import  java.awt.datatransfer.DataFlavor;
import  java.awt.datatransfer.Transferable;
import  java.awt.dnd.DnDConstants;
import  java.awt.dnd.DragGestureEvent;
import  java.awt.dnd.DragGestureListener;
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.io.ByteArrayInputStream;
import  java.io.ByteArrayOutputStream;
import  java.io.IOException;
import  java.io.OutputStreamWriter;
import  java.util.Iterator;

import  javax.swing.JFrame;
import  javax.swing.JLabel;
import  javax.swing.UIManager;

public  class  JLabelDragSource  implements  DragGestureListener,
        DragSourceListener  {
    public  JLabelDragSource(JLabel  label)  {
        this.label  =  label;

        //  Use  the  default  DragSource
        DragSource  dragSource  =  DragSource.getDefaultDragSource();

        //  Create  a  DragGestureRecognizer  and
        //  register  as  the  listener
        dragSource.createDefaultDragGestureRecognizer(label,
                DnDConstants.ACTION_COPY_OR_MOVE,  this);
    }

    //  Implementation  of  DragGestureListener  interface.
    public  void  dragGestureRecognized(DragGestureEvent  dge)  {
        if  (DnDUtils.isDebugEnabled())  {
            DnDUtils.debugPrintln("Initiating  event  is  "
                    +  dge.getTriggerEvent());
            DnDUtils.debugPrintln("Complete  event  set  is:");
            Iterator  iter  =  dge.iterator();
            while  (iter.hasNext())  {
                DnDUtils.debugPrintln("\t"  +  iter.next());
            }
        }
        Transferable  transferable  =  new  JLabelTransferable(label);
        dge.startDrag(null,  transferable,  this);
    }

    //  Implementation  of  DragSourceListener  interface
    public  void  dragEnter(DragSourceDragEvent  dsde)  {
        DnDUtils.debugPrintln("Drag  Source:  dragEnter,  drop  action  =  "
                +  DnDUtils.showActions(dsde.getDropAction()));
    }

    public  void  dragOver(DragSourceDragEvent  dsde)  {
        DnDUtils.debugPrintln("Drag  Source:  dragOver,  drop  action  =  "
                +  DnDUtils.showActions(dsde.getDropAction()));
    }

    public  void  dragExit(DragSourceEvent  dse)  {
        DnDUtils.debugPrintln("Drag  Source:  dragExit");
    }

    public  void  dropActionChanged(DragSourceDragEvent  dsde)  {
        DnDUtils.debugPrintln("Drag  Source:  dropActionChanged,  drop  action  =  "
                +  DnDUtils.showActions(dsde.getDropAction()));
    }

    public  void  dragDropEnd(DragSourceDropEvent  dsde)  {
        DnDUtils.debugPrintln("Drag  Source:  drop  completed,  drop  action  =  "
                +  DnDUtils.showActions(dsde.getDropAction())  +  ",  success:  "
                +  dsde.getDropSuccess());
    }

    public  static  void  main(String[]  args)  {
        try  {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }  catch  (Exception  evt)  {}
    
        JFrame  f  =  new  JFrame("Draggable  JLabel");
        JLabel  label  =  new  JLabel("Drag  this  text",  JLabel.CENTER);
        label.setFont(new  Font("Serif",  Font.BOLD,  32));
        f.getContentPane().add(label);
        f.pack();
        f.setVisible(true);

        //  Attach  the  drag  source
        JLabelDragSource  dragSource  =  new  JLabelDragSource(label);
    }

    protected  JLabel  label;  //  The  associated  JLabel
}

class  DnDUtils  {
    public  static  String  showActions(int  action)  {
        String  actions  =  "";
        if  ((action  &  (DnDConstants.ACTION_LINK  |  DnDConstants.ACTION_COPY_OR_MOVE))  ==  0)  {
            return  "None";
        }

        if  ((action  &  DnDConstants.ACTION_COPY)  !=  0)  {
            actions  +=  "Copy  ";
        }

        if  ((action  &  DnDConstants.ACTION_MOVE)  !=  0)  {
            actions  +=  "Move  ";
        }

        if  ((action  &  DnDConstants.ACTION_LINK)  !=  0)  {
            actions  +=  "Link";
        }

        return  actions;
    }

    public  static  boolean  isDebugEnabled()  {
        return  debugEnabled;
    }

    public  static  void  debugPrintln(String  s)  {
        if  (debugEnabled)  {
            System.out.println(s);
        }
    }

    private  static  boolean  debugEnabled  =  (System
            .getProperty("DnDExamples.debug")  !=  null);
}

class  JLabelTransferable  implements  Transferable  {
    public  JLabelTransferable(JLabel  label)  {
        this.label  =  label;
    }

    //  Implementation  of  the  Transferable  interface
    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;
            }
        }

        return  false;
    }

    public  Object  getTransferData(DataFlavor  fl)  {
        if  (!isDataFlavorSupported(fl))  {
            return  null;
        }

        if  (fl.equals(DataFlavor.stringFlavor))  {
            //  String  -  return  the  text  as  a  String
            return  label.getText()  +  "  (DataFlavor.stringFlavor)";
        }  else  if  (fl.equals(jLabelFlavor))  {
            //  The  JLabel  itself  -  just  return  the  label.
            return  label;
        }  else  {
            //  Plain  text  -  return  an  InputStream
            try  {
                String  targetText  =  label.getText()  +  "  (plain  text  flavor)";
                int  length  =  targetText.length();
                ByteArrayOutputStream  os  =  new  ByteArrayOutputStream();
                OutputStreamWriter  w  =  new  OutputStreamWriter(os);
                w.write(targetText,  0,  length);
                w.flush();
                byte[]  bytes  =  os.toByteArray();
                w.close();
                return  new  ByteArrayInputStream(bytes);
            }  catch  (IOException  e)  {
                return  null;
            }
        }
    }

    //  A  flavor  that  transfers  a  copy  of  the  JLabel
    public  static  final  DataFlavor  jLabelFlavor  =  new  DataFlavor(JLabel.class,
            "Swing  JLabel");

    private  JLabel  label;  //  The  label  being  transferred

    private  static  final  DataFlavor[]  flavors  =  new  DataFlavor[]  {
            DataFlavor.stringFlavor,
            new  DataFlavor("text/plain;  charset=ascii",  "ASCII  text"),
            jLabelFlavor  };
}

721 view

4.0 stars