如何将图像从一个面板拖动到另一个面板 [英] How to drag an image from one panel to other

查看:195
本文介绍了如何将图像从一个面板拖动到另一个面板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个框架,然后在其中显示面板。我将图像放在一个面板中,现在我需要将该图像拖到另一个面板上。我该怎么做请稍等一下解释一下。

解决方案

使用纯java的简单示例 DragGestureListener DropTargetAdapter TransferHandler 用于DnD支持一个面板上的图像到另一个面板:



在任何形状被点击并拖动之前:





选择绿色形状并拖动到上面的空白面板上:



  import java.awt.BorderLayout; 
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.IOException;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.border.TitledBorder;

public class Test {

public static void main(String [] args){
createAndShowJFrame();
}

public static void createAndShowJFrame(){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){

JFrame frame = createJFrame();
frame.setVisible(true);

}
});
}

private static JFrame createJFrame(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.setTitle(Test);

JPanel panel = createEmptyJPanel();
new MyDropTargetListener(panel); //这必须完成,否则我们无法将任何图像放到空面板上

frame.add(panel,BorderLayout.CENTER);

try {
frame.add(createJLabelPanel(),BorderLayout.SOUTH);
} catch(Exception ex){
ex.printStackTrace();
}

frame.pack();

返回框架;
}

private static JPanel createEmptyJPanel(){
final JPanel p = new JPanel(){
@Override
public Dimension getPreferredSize(){
返回新维度(300,300);
}
};
p.setBorder(new TitledBorder(Drag Image to this panel));

TransferHandler dnd = new TransferHandler(){
@Override
public boolean canImport(TransferSupport support){
if(!support.isDrop()){
返回false;
}
//只有Strings
if(!support.isDataFlavorSupported(DataFlavor.imageFlavor)){
return false;
}
返回true;
}

@Override
public boolean importData(TransferSupport support){
if(!canImport(support)){
return false;
}

可转让tansferable = support.getTransferable();
图标ico;
try {
ico =(Icon)tansferable.getTransferData(DataFlavor.imageFlavor);
} catch(Exception e){
e.printStackTrace();
返回false;
}
p.add(new JLabel(ico));
返回true;
}
};

p.setTransferHandler(dnd);

return p;
}

private static JPanel createJLabelPanel()throws Exception {
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(Drag Image from here to Panel above));

JLabel label1 = new JLabel(new ImageIcon(new URL(http://i.stack.imgur.com/gJmeJ.png)));
JLabel label2 = new JLabel(new ImageIcon(new URL(http://i.stack.imgur.com/8BGfi.png)));
JLabel label3 = new JLabel(new ImageIcon(new URL(http://i.stack.imgur.com/1lgtq.png)));

MyDragGestureListener dlistener = new MyDragGestureListener();
DragSource ds1 = new DragSource();
ds1.createDefaultDragGestureRecognizer(label1,DnDConstants.ACTION_COPY,dlistener);

DragSource ds2 = new DragSource();
ds2.createDefaultDragGestureRecognizer(label2,DnDConstants.ACTION_COPY,dlistener);

DragSource ds3 = new DragSource();
ds3.createDefaultDragGestureRecognizer(label3,DnDConstants.ACTION_COPY,dlistener);

panel.add(label1);
panel.add(label2);
panel.add(label3);
返回面板;
}
}

class MyDropTargetListener extends DropTargetAdapter {

private DropTarget dropTarget;
private JPanel p;

public MyDropTargetListener(JPanel panel){
p = panel;
dropTarget = new DropTarget(panel,DnDConstants.ACTION_COPY,this,true,null);

}

@Override
public void drop(DropTargetDropEvent event){
try {
DropTarget test =(DropTarget)event.getSource ();
组件ca =(Component)test.getComponent();
点dropPoint = ca.getMousePosition();
可转移tr = event.getTransferable();

if(event.isDataFlavorSupported(DataFlavor.imageFlavor)){
图标ico =(图标)tr.getTransferData(DataFlavor.imageFlavor);

if(ico!= null){

p.add(new JLabel(ico));
p.revalidate();
p.repaint();
event.dropComplete(true);
}
} else {
event.rejectDrop();
}
} catch(Exception e){
e.printStackTrace();
event.rejectDrop();
}
}
}

class MyDragGestureListener实现DragGestureListener {

@Override
public void dragGestureRecognized(DragGestureEvent event){
JLabel label =(JLabel)event.getComponent();
final Icon ico = label.getIcon();


可转移转移= new可转移(){
@Override
public DataFlavor [] getTransferDataFlavors(){
返回新的DataFlavor [] {DataFlavor。 imageFlavor};
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor){
if(!isDataFlavorSupported(flavor)){
return false;
}
返回true;
}

@Override
public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException,IOException {
return ico;
}
};
event.startDrag(null,transferable);
}
}


I had created a frame and then panels in it. I had placed an image in one panel, now I need to drag that image to another panel. How could I do that. Please explain step by step as am a beginner.

解决方案

Quick example using pure java, DragGestureListener, DropTargetAdapter and TransferHandler for DnD support of images on one panel to another:

Before any shape is clicked and dragged:

after green shape is selected and dragged onto empty panel above:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.IOException;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.border.TitledBorder;

public class Test {

    public static void main(String[] args) {
        createAndShowJFrame();
    }

    public static void createAndShowJFrame() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = createJFrame();
                frame.setVisible(true);

            }
        });
    }

    private static JFrame createJFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        frame.setTitle("Test");

        JPanel panel = createEmptyJPanel();
        new MyDropTargetListener(panel);//this must be done or we wont be able to drop any image onto the empty panel

        frame.add(panel, BorderLayout.CENTER);

        try {
            frame.add(createJLabelPanel(), BorderLayout.SOUTH);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        frame.pack();

        return frame;
    }

    private static JPanel createEmptyJPanel() {
        final JPanel p = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };
        p.setBorder(new TitledBorder("Drag Image onto this panel"));

        TransferHandler dnd = new TransferHandler() {
            @Override
            public boolean canImport(TransferSupport support) {
                if (!support.isDrop()) {
                    return false;
                }
                //only Strings
                if (!support.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                    return false;
                }
                return true;
            }

            @Override
            public boolean importData(TransferSupport support) {
                if (!canImport(support)) {
                    return false;
                }

                Transferable tansferable = support.getTransferable();
                Icon ico;
                try {
                    ico = (Icon) tansferable.getTransferData(DataFlavor.imageFlavor);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
                p.add(new JLabel(ico));
                return true;
            }
        };

        p.setTransferHandler(dnd);

        return p;
    }

    private static JPanel createJLabelPanel() throws Exception {
        JPanel panel = new JPanel();
        panel.setBorder(new TitledBorder("Drag Image from here to Panel above"));

        JLabel label1 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/gJmeJ.png")));
        JLabel label2 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/8BGfi.png")));
        JLabel label3 = new JLabel(new ImageIcon(new URL("http://i.stack.imgur.com/1lgtq.png")));

        MyDragGestureListener dlistener = new MyDragGestureListener();
        DragSource ds1 = new DragSource();
        ds1.createDefaultDragGestureRecognizer(label1, DnDConstants.ACTION_COPY, dlistener);

        DragSource ds2 = new DragSource();
        ds2.createDefaultDragGestureRecognizer(label2, DnDConstants.ACTION_COPY, dlistener);

        DragSource ds3 = new DragSource();
        ds3.createDefaultDragGestureRecognizer(label3, DnDConstants.ACTION_COPY, dlistener);

        panel.add(label1);
        panel.add(label2);
        panel.add(label3);
        return panel;
    }
}

class MyDropTargetListener extends DropTargetAdapter {

    private DropTarget dropTarget;
    private JPanel p;

    public MyDropTargetListener(JPanel panel) {
        p = panel;
        dropTarget = new DropTarget(panel, DnDConstants.ACTION_COPY, this, true, null);

    }

    @Override
    public void drop(DropTargetDropEvent event) {
        try {
            DropTarget test = (DropTarget) event.getSource();
            Component ca = (Component) test.getComponent();
            Point dropPoint = ca.getMousePosition();
            Transferable tr = event.getTransferable();

            if (event.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                Icon ico = (Icon) tr.getTransferData(DataFlavor.imageFlavor);

                if (ico != null) {

                    p.add(new JLabel(ico));
                    p.revalidate();
                    p.repaint();
                    event.dropComplete(true);
                }
            } else {
                event.rejectDrop();
            }
        } catch (Exception e) {
            e.printStackTrace();
            event.rejectDrop();
        }
    }
}

class MyDragGestureListener implements DragGestureListener {

    @Override
    public void dragGestureRecognized(DragGestureEvent event) {
        JLabel label = (JLabel) event.getComponent();
        final Icon ico = label.getIcon();


        Transferable transferable = new Transferable() {
            @Override
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[]{DataFlavor.imageFlavor};
            }

            @Override
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                if (!isDataFlavorSupported(flavor)) {
                    return false;
                }
                return true;
            }

            @Override
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                return ico;
            }
        };
        event.startDrag(null, transferable);
    }
}

这篇关于如何将图像从一个面板拖动到另一个面板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆