Swing/Web image drag

Web Image drag into JPanel

Soul-Learner 2016. 9. 7. 20:17

웹브라우저 화면의 이미지를 마우스로 드래그하여 JPanel에 그리는 예



웹브라우저에서 이미지를 드래그하여 자바 화면에 그리기 결과 화면




package org.kdea.swing;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.*;
import java.io.*;
import java.util.List;

import javax.imageio.ImageIO;

public class WebImageDragDemo extends JFrame 
{
	static ImgDragPanel idp;	

	WebImageDragDemo(){
		setTitle("웹페이지에서 이미지를 드래그하여 이 화면에 올려보세요");
		setBounds(200,100,600,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		idp = new ImgDragPanel();
		add(idp, BorderLayout.CENTER);
		
		setVisible(true);
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				new WebImageDragDemo();
			}
		});
	}
	
	//내부 클래스
	class ImgDragPanel extends JPanel
	{
		BufferedImage bimg;
		
		ImgDragPanel() 
		{
			this.setTransferHandler(new TransferHandler() {
	    	
		      @Override 
		      public boolean canImport(JComponent component, DataFlavor[] flavors) {
		        return true;
		      }
		      
		      @Override 
		      public boolean importData(JComponent component, Transferable transferable) {
		        //label.setText("");
		        try {
		          for (DataFlavor flavor : transferable.getTransferDataFlavors()) {
		            System.out.println("flavor:"+flavor);
		            if (DataFlavor.imageFlavor.equals(flavor)) {
		              Object o = transferable.getTransferData(DataFlavor.imageFlavor);
		              if (o instanceof Image) {
		                //label.setIcon(new ImageIcon((Image) o));
		            	Image img = (Image)o;
		            	BufferedImage bimg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
		                // Draw the image on to the buffered image
		                Graphics2D bGr = bimg.createGraphics();
		                bGr.drawImage(img, 0, 0, null);
		                bGr.dispose();
		            	idp.bimg = bimg;
		            	idp.repaint();
		                return true;
		              }
		            }
		            if (DataFlavor.javaFileListFlavor.equals(flavor)) {
		              Object o = transferable.getTransferData(DataFlavor.javaFileListFlavor);
		              if (o instanceof List) {
		                List list = (List) o;
		                for (Object f : list) {
		                  if (f instanceof File) {
		                    File file = (File) f;
		                    System.out.println("file:"+file);
		                    if (!file.getName().endsWith(".bmp")) {
		                      //label.setIcon(new ImageIcon(file.getAbsolutePath()));
		                      idp.bimg = ImageIO.read(file);
		                      idp.repaint();
		                      return true;
		                    }
		                  }
		                }
		              }
		            }
		          }
		        } catch (Exception ex) {
		          ex.printStackTrace();
		        }
		        return false;
		      }
		      
		      @Override 
		      public int getSourceActions(JComponent component) {
		        return COPY;
		      }
		    }); // end of TransferHandler()
		}// end of constructor
		
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(bimg, 0, 0, null);
		}
	}
}