はじめに
processing3系でドラッグアンドドロップを実装した所詰まった所を記録します。
この記事で紹介するコードの多くはたーせる氏のProcessingアプリケーションでファイルのドラッグ&ドロップをサポートの記事を参考に書かれています。
# コード
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.File;
import java.io.IOException;
import java.awt.Component;
import java.util.List;
DropTarget dropTarget;
Component component;
void dragDropFile() {
component = (Component)this.surface.getNative();
dropTarget = new DropTarget(component, new DropTargetListener() {
public void dragEnter(DropTargetDragEvent dtde) {
}
public void dragOver(DropTargetDragEvent dtde) {
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
}
public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Transferable trans = dtde.getTransferable();
List<File> fileNameList = null;
if (trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
try {
fileNameList = (List<File>)
trans.getTransferData(DataFlavor.javaFileListFlavor);
}
catch (UnsupportedFlavorException ex) {
println(ex);
}
catch (IOException ex) {
println(ex);
}
}
if (fileNameList == null) return;
for (File f : fileNameList) {
println(f.getAbsolutePath());
}
}
}
);
}
悩んだ所
processing3系でDropTargetの引数にスケッチを指すthis
を入れようとすると、The constructor "dnd.DropTarget(sketch_171223a. DropTargetListner(){})" does not eistsと怒られてしまいます。
これはthis
がそこに引数として入るべきであるComponent
型では無いため怒られています。
そこで、java.awt.Componnet
にスケッチを入れるためにthis.surface.getNative()
をcomponent型として取って引数にする必要があります。
参考
http://tercel-sakuragaoka.blogspot.jp/2011/10/processing.html
https://qiita.com/progfay/items/a81e2c4dc4785c3492f4