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
dai un'occhiata qui:
stackoverflow.com/questions/1204580/…
stackoverflow.com/questions/811248/…
e al file allegato
aaa
08/12/12 11:31
iMO
Grazie mille per le dritte! Ho risolto così:
Il problema ora è che non mi funziona più la gestione dell'evento quando premo invio per cambiare testo all'interno del JTextField.
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:
e prima dell'ultima parentesi graffa, cioè quella che chiude la classe Frame, inserisci quest'altra riga:
Ed ecco fatto
Un consiglio: nell'implements della classe lascia solo quella riguardante il drag&drop, eliminando ovviamente gli eventi associati, come l'actionlistener
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 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
(non ho mai programmato su altri OS... solo nella shell di linux )
(non ho mai programmato su altri OS... solo nella shell di linux )
Ultima modifica effettuata da bububs 11/12/12 15:30
aaa