JAVA Drag and Drop Demo

DragSource에서 DropTarget으로 <<Transferable>> Data가 전송되는 일련의 과정.

DropTarget 생성자 중 가장 매개변수가 많은 것을 살펴보자.

DropTarget(Component c, int ops,DropTargetListener dtl,boolean act,FlavorTree ft)
예)

  1. target = new DropTarget(editor,DnDConstants.ACTION_COPY_OR_MOVE,
  2.                 (DropTargetListener) this,true,null);

 매개변수중 int ops부분을 살펴보자.
DnDConstants.ACTION_COPY_OR_MOVE 가 보인다.
DnDConstants 클래스는 Drag & Drop이 발생하는 경우 처리되는 오퍼레이션의 형태를 표현한 것이다.

ACTION_COPY_OR_MOVE 는 복사 혹은 이동을 표현한것이고,
ACTION_COPY는 복사만, ACTION_MOVE는 이동만 표현한것 등등 이 있다.

*DropTagetListener를 구현하는 과정에서 매개변수로 전달되는 것들이 미묘하게 다르다 ㅠ

드랍타겟 생성 ->드래그소스에서 읽어온 정보들을 Transferable하게 적재한다. ->드랍타켓에 운반 완료.


윈도우탐색기의 텍스트파일을 드래그앤 드랍하면 내용을 가져오는 예제

DNDText.java


  1. import java.io.*;
  2. import java.awt.dnd.*;
  3. import java.awt.datatransfer.*;
  4. import javax.swing.*;
  5.  
  6. public class DnDText extends JFrame implements DropTargetListener{
  7.     JTextArea editor;
  8.     DropTarget target;
  9.    
  10.     public DnDText(){
  11.         super("Drag & Drop");
  12.         editor = new JTextArea();
  13.         target = new DropTarget(editor,DnDConstants.ACTION_COPY_OR_MOVE,
  14.                 (DropTargetListener) this,true,null);
  15.         getContentPane().add("Center",new JScrollPane(editor));
  16.        
  17.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  18.         setSize(450,500);
  19.         setVisible(true);
  20.     }
  21.     /* DropTargetListener 인터페이스 구현을 위한 부분 */
  22.     public void dragEnter(DropTargetDragEvent dtde){
  23.         System.out.println("dragEnter");
  24.     }
  25.     public void dragExit(DropTargetEvent dtde){
  26.         System.out.println("dragExit");
  27.     }
  28.     public void dragOver(DropTargetDragEvent dtde){
  29.         System.out.println("dragOver");
  30.     }
  31.     public void drop(DropTargetDropEvent dtde){
  32.         System.out.println("drop");
  33.         //액션이 copy or move인 경우에 읽어들인다.
  34.         if((dtde.getDropAction() &
  35.                 DnDConstants.ACTION_COPY_OR_MOVE)!=0){
  36.             dtde.acceptDrop(dtde.getDropAction());
  37.             Transferable tr = dtde.getTransferable();
  38.             try{
  39.                 //전달되는 파일을 리스트형태로 변환
  40.                 //파일리스트의 DataFlavor를 이용하여 tr에 저장
  41.                 java.util.List list = (java.util.List)
  42.                 tr.getTransferData(DataFlavor.javaFileListFlavor);
  43.                 //리스트의 첫번째 원소를 파일로 읽어들인다.
  44.                 File file = (File)list.get(0);
  45.                 char buf[] = new char[1024];
  46.                 BufferedReader in = new BufferedReader(new  FileReader(file));
  47.                 int n = -1;
  48.                 editor.setText("");
  49.                 while((n=in.read(buf,0,1024))!=-1){
  50.                     editor.append(new String(buf,0,n));
  51.                 }
  52.                 in.close();
  53.             }catch(Exception e){
  54.                 e.printStackTrace();
  55.             }
  56.         }
  57.     }
  58.     public void dropActionChanged(DropTargetDragEvent dtde){
  59.         System.out.println("dropActionChanged");
  60.     }
  61.     public static void main(String[] args) {
  62.         new DnDText();
  63.     }
  64.    
  65.    
  66. }

댓글

  1. 코드 정말 잘 봤습니다.
    한가지 이해가지 않는 부분이 있는데요, 파일을 드래그를 통해서 다른 컴포넌트로 전송하는데 파일을 잠시 Dataflavor형 인스턴스로 전환해 Transferable 형 변수를 매개로 파일을 전송한다고 생각하면 제대로 이해한 건가요? 41번째줄과 42번째줄이 정확이 어떤 방식으로 굴러가는지 궁금하네요! 메소드 getTransferData()의 인자 또한 이해가 잘 되지 않습니다.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

[Win32 API] WINAPI - 함수호출규약

JAVA Frame Icon setting

JAVA Spinner