Swing/DragSource のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DragSource へ行く。
- 1 (2005-11-14 (月) 21:13:08)
- 2 (2005-11-17 (木) 17:57:18)
- 3 (2005-11-29 (火) 13:37:48)
- 4 (2006-02-27 (月) 15:50:12)
- 5 (2006-04-12 (水) 19:42:25)
- 6 (2006-04-16 (日) 01:35:56)
- 7 (2007-03-15 (木) 14:27:54)
- 8 (2007-07-27 (金) 13:13:14)
- 9 (2012-02-08 (水) 21:23:58)
- 10 (2013-03-21 (木) 16:06:06)
- 11 (2013-05-26 (日) 05:30:45)
- 12 (2015-01-08 (木) 14:04:55)
- 13 (2015-12-15 (火) 17:06:25)
- 14 (2017-06-09 (金) 13:11:35)
- 15 (2018-06-05 (火) 13:44:46)
- 16 (2018-10-17 (水) 18:40:51)
- 17 (2020-10-15 (木) 09:55:04)
- 18 (2022-08-02 (火) 16:39:50)
- 19 (2023-09-06 (水) 12:06:56)
- 20 (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:
概要
Java
アプリケーションからWindows
のデスクトップなどにFile
をドロップします。
Screenshot
Advertisement
サンプルコード
class MyDragGestureListener implements DragGestureListener {
@Override public void dragGestureRecognized(DragGestureEvent dge) {
final File tmpfile = getFile();
if (tmpfile == null) {
return;
}
Transferable tran = new Transferable() {
@Override public Object getTransferData(DataFlavor flavor) {
ArrayList al = new ArrayList(1);
al.add(tmpfile);
return al;
}
@Override public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.javaFileListFlavor };
}
@Override public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.javaFileListFlavor);
}
};
DragSourceAdapter dsa = new DragSourceAdapter() {
@Override public void dragDropEnd(DragSourceDropEvent dsde) {
if (dsde.getDropSuccess()) {
clearFile();
}
}
};
dge.startDrag(DragSource.DefaultMoveDrop, tran, dsa);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ボタンで空の一時ファイルを生成し、ラベルをマウスでドラッグすると生成したファイルをデスクトップなどに移動することが出来ます。
以下のようにDragGestureListener
を登録してラベルをドラッグ&ドロップすることで、JFileChooser
などで書き出すフォルダなどを指定する手間が省いています。
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(label,
DnDConstants.ACTION_MOVE, new MyDragGestureListener());
JDK 1.6.0
以上なら、以下のようなTransferHandler
をJLabel
に設定する方法もあります。
label.setTransferHandler(new TransferHandler() {
@Override public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override protected Transferable createTransferable(JComponent c) {
File tmpfile = getFile();
if (tmpfile == null) {
return null;
} else {
return new TempFileTransferable(tmpfile);
}
}
@Override protected void exportDone(JComponent c, Transferable d, int a) {
cleanup(c, a == MOVE);
}
private void cleanup(JComponent c, boolean removeFile) {
if (removeFile) {
clearFile();
c.repaint();
}
}
});
label.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e) {
System.out.println(e);
JComponent c = (JComponent) e.getSource();
c.getTransferHandler().exportAsDrag(c, e, TransferHandler.COPY);
}
});