想实现这样一个功能先把png图片加载到自定义控件上面   然后这个控件是可以拖动的就是你可以点击一个小的图片  然后拖动它到场景里面来求例子程序

解决方案 »

  1.   

    自己找了一个 
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.dnd.DND;
    import org.eclipse.swt.dnd.DragSource;
    import org.eclipse.swt.dnd.DragSourceAdapter;
    import org.eclipse.swt.dnd.DragSourceEvent;
    import org.eclipse.swt.dnd.DropTarget;
    import org.eclipse.swt.dnd.DropTargetAdapter;
    import org.eclipse.swt.dnd.DropTargetEvent;
    import org.eclipse.swt.dnd.TextTransfer;
    import org.eclipse.swt.dnd.Transfer;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Tree;
    import org.eclipse.swt.widgets.TreeItem;public class SimpleDNDExample {  public static void main(String[] args) {
        Shell shell = new Shell();
        shell.setLayout(new FillLayout());    // Create the tree and some tree items
        final Tree tree = new Tree(shell, SWT.NONE);
        TreeItem item1 = new TreeItem(tree, SWT.NONE);
        item1.setText("Item 1");
        TreeItem item2 = new TreeItem(tree, SWT.NONE);
        item2.setText("Item 2");
        TreeItem item3 = new TreeItem(tree, SWT.NONE);
        item3.setText("Item 3");
        TreeItem item4 = new TreeItem(tree, SWT.NONE);
        item4.setText("Item 4");    // Create the drag source on the tree
        DragSource ds = new DragSource(tree, DND.DROP_MOVE);
        ds.setTransfer(new Transfer[] { TextTransfer.getInstance() });
        ds.addDragListener(new DragSourceAdapter() {
          public void dragSetData(DragSourceEvent event) {
            // Set the data to be the first selected item's text
            event.data = tree.getSelection()[0].getText();
          }
        });    // Create the button
        final Button button = new Button(shell, SWT.FLAT);
        button.setText("Button");
        button.setAlignment(SWT.CENTER);    // Create the drop target on the button
        DropTarget dt = new DropTarget(button, DND.DROP_MOVE);
        dt.setTransfer(new Transfer[] { TextTransfer.getInstance() });
        dt.addDropListener(new DropTargetAdapter() {
          public void drop(DropTargetEvent event) {
            // Set the buttons text to be the text being dropped
            button.setText((String) event.data);
          }
        });    shell.pack();
        shell.open();
        Display display = Display.getDefault();
        while (!shell.isDisposed())
          if (!display.readAndDispatch())
            display.sleep();
        display.dispose();
      }}
      

  2.   

    http://www.111cn.cn/jsp/49/81c2aa90a2e6a3608a766abb54d0f1c2.htm
      

  3.   

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.io.IOException;import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.TransferHandler;public class PictureDnd { private JFrame mainFrame;
    private JPanel mainPanel;
    private PictureComponent[] pictures; public PictureDnd() {
    mainFrame = new JFrame();
    mainPanel = new JPanel(new GridLayout(2, 2)); pictures = new PictureComponent[4];
    pictures[0] = new PictureComponent(new ImageIcon("C:\\Image\\1.jpeg").getImage());
    pictures[1] = new PictureComponent(new ImageIcon("C:\\Image\\2.jpeg").getImage());
    pictures[2] = new PictureComponent(null);
    pictures[3] = new PictureComponent(null); mainPanel.add(pictures[0]);
    mainPanel.add(pictures[1]);
    mainPanel.add(pictures[2]);
    mainPanel.add(pictures[3]);
    mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); mainFrame.getContentPane().add(mainPanel);
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setSize(350, 400);
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setVisible(true);
    } public static void main(String[] args) {
    new PictureDnd();
    } private class PictureComponent extends JComponent implements FocusListener,
    MouseListener, MouseMotionListener { private static final long serialVersionUID = 861556623335710551L;
    private Image image;

    public PictureComponent(Image image){
    this.image = image;
    setPreferredSize(new Dimension(125, 125));
    setFocusable(true);
    setTransferHandler(new PictureTransferHandler());
    addFocusListener(this);
    addMouseListener(this);
    addMouseMotionListener(this);
    }

    public Image getImage(){
    return image;
    }

    public void setImage(Image image){
    this.image = image;
    repaint();
    }

    // 绘制我们的类,简单的在上面画一幅图
    public void paintComponent(Graphics graphics){
    Graphics g = graphics.create();
    g.setColor(Color.green); // 将当前图形上下文的当前颜色设置成green
    g.fillRect(0, 0, image != null ? image.getWidth(this) : 125, image != null ? image.getHeight(this) : 125); // 绘制矩形
    if(image != null){
    g.drawImage(image, 0, 0, this);
    }
    if(isFocusOwner()){
    g.setColor(Color.red);
    }else{
    g.setColor(Color.black);
    }
    // 画边框,如果是焦点获得者,边框为红色,否则为黑色
    g.drawRect(0, 0, image != null ? image.getWidth(this) : 125, image != null ? image.getHeight(this) : 125);
    g.dispose(); // 释放此图形的上下文并释放它所使用的所有系统资源。
    }

    @Override
    public void focusGained(FocusEvent e) {
    repaint();
    } @Override
    public void focusLost(FocusEvent e) {
    repaint();
    } @Override
    public void mouseClicked(MouseEvent e) {
    requestFocusInWindow();
    } @Override
    public void mouseEntered(MouseEvent e) { } @Override
    public void mouseExited(MouseEvent e) { } @Override
    public void mousePressed(MouseEvent e) { } @Override
    public void mouseReleased(MouseEvent e) { } @Override
    public void mouseDragged(MouseEvent e) {
    JComponent c = (JComponent)e.getSource();
    TransferHandler handler = c.getTransferHandler();
    // exportAsDrag
    handler.exportAsDrag(c, e, TransferHandler.COPY);
    } @Override
    public void mouseMoved(MouseEvent e) { } }

    // 一个用来包装数据的类, 此类只包含有图片类型的数据,
    private class TransferablePicture implements Transferable{

    /* DataFlavor.imageFlavor 是DataFlavor定义的一个DataFlavor类型
     因为图片常用,所以它自带有这种类型,不用我们自定义,以后再看如何定义*/
    DataFlavor flavors[] = {DataFlavor.imageFlavor};
    Image image;

    public TransferablePicture(Image image){
    this.image = image;
    }

    @Override
    public Object getTransferData(DataFlavor flavor)
    throws UnsupportedFlavorException, IOException {
    // 根据参数返回数据
    if(flavor.equals(DataFlavor.imageFlavor)){
    return image;
    }
    return null;
    } @Override
    public DataFlavor[] getTransferDataFlavors() {
    return flavors;// 返回Transferable包含哪些数据类型
    } @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
    for(DataFlavor f: flavors){
    if(flavor.equals(f)){
    return true;
    }
    }
    return false;
    // return flavor.equals(DataFlavor.imageFlavor);
    }

    }

    @SuppressWarnings("serial")
    private class PictureTransferHandler extends TransferHandler{
    public Transferable createTransferable(JComponent c){
    PictureComponent pc = (PictureComponent)c;
    // 调用构造函数以包装数据,将我们要包装的数据以参数形式传入
    return new TransferablePicture(pc.getImage());
    }

    // 判断是否可以导入数据
    public boolean canImport(JComponent c, DataFlavor[] flavors){
    for(DataFlavor flavor: flavors){
    if(flavor.equals(DataFlavor.imageFlavor)){
    return true;
    }
    }
    return false;
    }

    // 导入数据
    public boolean importData(JComponent c, Transferable t){
    if(canImport(c, t.getTransferDataFlavors())){
    PictureComponent pc = (PictureComponent)c;
    try {
    Image image = (Image) t.getTransferData(DataFlavor.imageFlavor);
    pc.setImage(image);
    return true;
    } catch (UnsupportedFlavorException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return false;
    }

    public void exportDone(JComponent c, Transferable data, int action){
    // 传完数据以后要判断是移动还是复杂,然后再决定是否要删除拖放源的数据
    PictureComponent picture = (PictureComponent) c;
    if(action == MOVE){
    picture.setImage(null);
    }
    }

    public int getSourceActions(JComponent c){
    return COPY_OR_MOVE;
    }

    }


    }