TITLE:FileをJavaアプリケーションからドロップ

FileをJavaアプリケーションからドロップ

編集者:Terai Atsuhiro~

作成日:2005-11-14
更新日:2024-01-19 (金) 11:21:43
  • category: swing folder: DragSource title: FileをJavaアプリケーションからドロップ tags: [DragAndDrop, File, DragGestureListener, TransferHandler] author: aterai pubdate: 2005-11-14T21:13:08+09:00 description: JavaアプリケーションからWindowsのデスクトップなどにFileをドロップします。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTL5-PTzWI/AAAAAAAAAYU/G2P--5GJWSU/s800/DragSource.png

概要

JavaアプリケーションからWindowsのデスクトップなどにFileをドロップします。

概要

JavaアプリケーションからWindowsのデスクトップなどにFileをドロップします。

サンプルコード

#spanend
#spanadd
label.setTransferHandler(new TransferHandler() {
#spanend
  @Override public int getSourceActions(JComponent c) {
    return TransferHandler.COPY_OR_MOVE;
  }

#spandel
#screenshot
#spanend
  @Override protected Transferable createTransferable(JComponent c) {
    File tmpfile = getFile();
    if (tmpfile == null) {
      return null;
    } else {
      return new TempFileTransferable(tmpfile);
    }
  }

#spandel
**サンプルコード [#nad9512e]
#spanend
 class MyDragGestureListener implements DragGestureListener {
   public void dragGestureRecognized(DragGestureEvent dge) {
     final File tmpfile = getFile();
     if(tmpfile==null) {
       return;
     }
     Transferable tran = new Transferable() {
       public Object getTransferData(DataFlavor flavor) {
         ArrayList al = new ArrayList(1);
         al.add(tmpfile);
         return al;
       }
       public DataFlavor[] getTransferDataFlavors() {
         return new DataFlavor[] { DataFlavor.javaFileListFlavor };
       }
       public boolean isDataFlavorSupported(DataFlavor flavor) {
         return flavor.equals(DataFlavor.javaFileListFlavor);
       }
     };
     DragSourceAdapter dsa = new DragSourceAdapter() {
       public void dragDropEnd(DragSourceDropEvent dsde) {
         if(dsde.getDropSuccess()) {
           clearFile();
         }
       }
     };
     dge.startDrag(DragSource.DefaultMoveDrop, tran, dsa);
   }
 }
  @Override protected void exportDone(JComponent c, Transferable d, int a) {
    cleanup(c, a == MOVE);
  }

#spandel
//-&jnlp;
#spanend
-&jar;
-&zip;
  private void cleanup(JComponent c, boolean removeFile) {
    if (removeFile) {
      clearFile();
      c.repaint();
    }
  }
#spanadd
});
#spanend
#spanadd
label.addMouseListener(new MouseAdapter() {
#spanend
  @Override public void mousePressed(MouseEvent e) {
    System.out.println(e);
    JComponent c = (JComponent) e.getSource();
    c.getTransferHandler().exportAsDrag(c, e, TransferHandler.COPY);
  }
#spanadd
});
#spanend
#spanadd
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ボタンで空の一時ファイルを生成し、ラベルをマウスでドラッグすると生成したファイルをデスクトップなどに移動することが出来ます。

解説

上記のサンプルでは、ボタンで空の一時ファイルを生成し中央のラベルをマウスでドラッグすると生成したファイルをデスクトップなどに移動できます。 以下のようにDragGestureListenerを登録することでラベルをD&Dし、JFileChooserなどで書き出すフォルダなどを指定する手間が省いています。
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(label,
       DnDConstants.ACTION_MOVE, new MyDragGestureListener());
  • TransferHandlerが使用不可のJava 1.5.0などでは、以下のようなDragGestureListenerを使用する必要がある

参考リンク

  • : : : o p u s - i : : : アイコンフリー素材
    #spanend
    #spanadd
    DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
    #spanend
          label, DnDConstants.ACTION_MOVE, new DragGestureListener() {
      @Override public void dragGestureRecognized(DragGestureEvent e) {
        File tmpFile = getFile();
        if (Objects.isNull(tmpFile)) {
          return;
        }
        DragSourceAdapter dsa = new DragSourceAdapter() {
          @Override public void dragDropEnd(DragSourceDropEvent ev) {
            if (ev.getDropSuccess()) {
              clearFile();
            }
          }
        };
        e.startDrag(
          DragSource.DefaultMoveDrop,
          new TempFileTransferable(tmpFile),
          dsa);
      }
    #spanadd
    });
    #spanend
    #spanadd
    

コメント

参考リンク

コメント