Oppure

Loading
06/12/12 16:48
iMO
Salve a tutti

io vorrei poter utilizzare il Drag&Drop in modo tale da poter trascinare una cartella all'interno di un JTextField e che all'interno di tale JTextField compaia il percorso della cartella. Ho provato a utilizzare il tutorial inerente al Drag&Drop pubblicato sul sito ma senza molto successo. Grazie in anticipo per ogni eventuale risposta.

iMO
aaa
07/12/12 11:39
bububs
c'è diverso materiale in giro ;)
dai un'occhiata qui:
stackoverflow.com/questions/1204580/…
stackoverflow.com/questions/811248/…
e al file allegato :k:
aaa
08/12/12 11:31
iMO
Grazie mille per le dritte! :k: Ho risolto così:
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


/**
 *
 * @author Nicolò
 */
public class Frame extends JFrame implements DropTargetListener, ActionListener{
    
    private static final long serialVersionUID = 2634459465126041816L;
    public JPanel jp;
    public JTextField txt;
    public DropTarget dt;
    
    //Costruttore
    public Frame(){
        super("iMusicOrganizer v3.0");
        setLocationRelativeTo(null);
        setBounds(0,0,1200,430);
                        
        jp = new JPanel();
        txt = new JTextField("Path...");
        
        Dimension d = new Dimension(1000,20);
        txt.setPreferredSize(d);
        
        jp.add(txt);
        getContentPane().add(jp);
        
        dt = new DropTarget(txt, this);
                
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void dragEnter(DropTargetDragEvent dtde) {
        System.out.println("Drag Init");
    }

    @Override
    public void dragOver(DropTargetDragEvent dtde) {
        System.out.println("Drag Over");
    }

    @Override
    public void dropActionChanged(DropTargetDragEvent dtde) {
        System.out.println("Drop Action Changed");
    }

    @Override
    public void dragExit(DropTargetEvent dte) {
        System.out.println("Drag End");
    }

    @Override
    public void drop(DropTargetDropEvent dtde) {
        try {
            /* Ok, get the dropped object and try to figure out what it is */
            Transferable tr = dtde.getTransferable();
            DataFlavor[] flavors = tr.getTransferDataFlavors();
            for (int i = 0; i < flavors.length; i++) {
                System.out.println("Possible flavor: " + flavors[i].getMimeType());
                /* Check for file lists specifically */
                if (flavors[i].isFlavorJavaFileListType()) {
                    // Great!  Accept copy drops...
                    dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                    /*ta.setText("Successful file list drop.\n\n");*/
                    // And add the list of file names to our text area
                    @SuppressWarnings("rawtypes")
                    java.util.List list = (java.util.List)tr.getTransferData(flavors[i]);
                    for (int j = 0; j < list.size(); j++) {
                        txt.setText(list.get(j) + "\n");
                    }
                    // If we made it this far, everything worked.
                    dtde.dropComplete(true);
                    return;
                }
                // Ok, is it another Java object?
                else if (flavors[i].isFlavorSerializedObjectType()) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                    txt.setText("Successful text drop.\n\n");
                    Object o = tr.getTransferData(flavors[i]);
                    txt.setText("Object: " + o);
                    dtde.dropComplete(true);
                    return;
                }
        
            }
            System.out.println("Drop failed: " + dtde);
            dtde.rejectDrop();
            } catch (Exception e) {
                e.printStackTrace();
                dtde.rejectDrop();
              }
    
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        
        //txt.addKeyListener(null);
        txt.setText("Path Correct!!");
    }

    
}


Il problema ora è che non mi funziona più la gestione dell'evento quando premo invio per cambiare testo all'interno del JTextField.
aaa
09/12/12 22:48
bububs
non capisco. Spiegati meglio. Cosa vuoi che faccia al premere del tasto invio?
aaa
10/12/12 8:31
iMO
Semplicemente vorrei che quando premo invio nel JTextField, all'interno di esso venga sostituita la stringa presente con un'altra stringa definita (ad es. "Ok!";).
aaa
10/12/12 12:25
bububs
Ok, molto semplice. Basta aggiungere nel costruttore questa riga di codice:
txt.addKeyListener( (KeyListener) new AscoltatoreTastiera() );

e prima dell'ultima parentesi graffa, cioè quella che chiude la classe Frame, inserisci quest'altra riga:
    public class AscoltatoreTastiera extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER)
                txt.setText("Path Correct!!");
        }
    }

Ed ecco fatto :)
Un consiglio: nell'implements della classe lascia solo quella riguardante il drag&drop, eliminando ovviamente gli eventi associati, come l'actionlistener
aaa
11/12/12 13:28
iMO
Grazie mille! Tutto perfetto e funzionante :k: un'altra curiosità: ma come mai non funziona in ubuntu il drag and drop? Come posso renderlo compatibile?
aaa
11/12/12 15:29
bububs
Mi dispiace ma non saprei perchè faccio parte del gruppo dei Windowsiani :rofl:
(non ho mai programmato su altri OS... solo nella shell di linux :rofl: )
Ultima modifica effettuata da bububs 11/12/12 15:30
aaa