Salve a tutti, questa è una guida su come effettuare il Drag & Drop in java. Cos'è il Drag & Drop? Beh è semplicemente un metodo per scambiare dati con l'applicazione. Ne fa uso ad esempio Messanger, dove per inviare un file possiamo spostarne l'icona all'interno del box per i messaggi. Ma come implementarlo? Ci sono delle classi apposite per farlo. Quella più importante è DropTargetListener, ovvero un ascoltatore di "bersagli" drop. Bisogna creare una classe che implementi la suddetta interfaccia, implementando i seguenti metodi:
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) 
Com'è facile intuire il primo metodo specifica cosa bisogna fare quando l'oggetto entra nel bersaglio drop, il secondo cosa bisogna fare quando si è al di sopra del bersaglio target, il terzo per quando cambia lo stato, il quarto per quando si esce del bersaglio. Il quinto è quello più importante: gli altri è anche possibile non scrivere alcuna implementazione (lasciare spazio vuoto tra una parentesi ed un'altra) ma la funzione drop è quello che ci serve. Andiamo a vedere come implementare questa funzione:
public void drop(DropTargetDropEvent dtde) {
//recuperiamo l'oggetto/i che stiamo trasferendo
Transferable obj = dtde.getTransferable();
//recuperiamo i vari mime type degli oggetti
DataFlavor[] data = obj.getTransferDataFlavors();
//scorriamo tutti i mime type
for (int i = 0; i < data.length; i++) {
//controlliamo che siano uguali (ad esempio) al mime type di una lista di file (a seconda di quello che ci serve la classe DataFlavor mette a disposizione Stringhe, Immagini, InputStream e molto altro.
if (data[i].isFlavorJavaFileListType()) {
//accettiamo il drop
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
try {
//recuperiamo la lista di file
List list = (List) obj.getTransferData(data[i]);
//la scorriamo tutta e la stampiamo a video
for(int j=0; j<list.size(); j++){
System.out.println(list.get(i).getAbsolutePath));
}
}catch(Exception e){
}
}
}
}
Perfetto ora abbiamo creato il nostro ascoltatore. Come specificato nel codice questo è un esempio per la gestione del drop di file, ma nulla di più semplice e cambiare questo codice per permettere il drop di stringhe ad esempio. Dopo aver creato l'ascoltatore però dobbiamo assegnarlo ad un componente. E come fare questo? Semplice nel nostro frame dovremo creare una variabile di tipo DropTarget il cui costruttore prende in input un componente e un ascoltatore Drag & Drop. Quindi basta fare:
DropTarget dt= new DropTarget(this, new Ascoltatore());
Dove Ascoltatore è la classe che implementa DropTargetListener che ci siamo definiti prima per creare un frame sul quale è possibile spostare dei file per farsi stampare la lista dei path!
Spero di essere stato chiaro e di aiuto. ;)