L'exemple de cet article décrit comment Java utilise le glisser-déposer de la souris pour échanger des données de programme, ce qu'on appelle la fonction glisser-déposer de la souris. La fonction glisser-déposer de la souris est très couramment utilisée dans les systèmes graphiques. Java fournit les packages java.awt.dnd et java.awt.datatransfer pour prendre en charge cette fonction. Cet exemple montre comment implémenter le glisser-déposer dans le programme. Lorsque vous cliquez avec la souris sur l'étiquette "Hello World!" dans la partie supérieure de la fenêtre et que vous la faites glisser vers la zone de texte dans la partie inférieure de la fenêtre, "Hello World!" World!" sera ajouté à la zone de texte. " texte ; continuez le processus ci-dessus et le texte continuera à être ajouté.
Les idées et méthodes de mise en œuvre spécifiques de la fonction du programme sont les suivantes : Dans la mise en œuvre du glisser-déposer de la souris, les deux concepts les plus importants sont la source du glisser et la cible du dépôt, à savoir la source du glisser et la cible du dépôt. La source du glisser et la cible du dépôt sont toutes deux associées au composant visible (comment pouvez-vous faire glisser s'il n'est pas visible ?!). L'essence de la technologie glisser-déposer est de transférer les données du composant source glisser-déposer vers le composant cible de placement. Par conséquent, d'un point de vue de bas niveau, le glisser-déposer est très proche de la technologie du presse-papiers. dans l'exemple ci-dessus.
Implémentation de la source de déplacement : la classe source de déplacement doit d'abord créer une instance DragGestureRecognizer, indiquant que la classe est une classe de composant source de déplacement ou contient un composant source de déplacement. Cela peut être réalisé en appelant la méthode createDefaultDragGestureRecognizer() de l'objet DataSource. La mise en œuvre spécifique est la suivante :
int action = DnDConstants.ACTION_COPY_OR_MOVE; //Type glisser-déposer ds.createDefaultDragGestureRecognizer(this,action,this);
L'instruction ci-dessus montre que le composant source de glisser est un objet d'instance de cette classe elle-même, que le type de glisser-déposer à effectuer est de type DnDConstants.ACTION_COPY_OR_MOVE et que la classe qui implémente l'interface DragGestureListener est cette classe. La source du glisser implémente généralement l'interface DragGestureListener, qui définit une méthode dragGestureRecognized(). Lorsque le glisser commence, DragGestureListener écoute l'événement, puis passe à la méthode dragGestureRecognized() pour traiter l'événement, par exemple en envoyant les données du glisser. source. Code spécifique :
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Méthode dragGestureRecognized() pas encore implémentée."); try{Transferable tr = new StringSelection(this.getText()); Texte sous forme de données, par transférable Emballage d'objet // Commencez à glisser, définissez le curseur sur la forme DragSource.DefaultCopyNoDrop, les données glisser-déposer sont un objet tr et DragSourceListener est cette classe dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {erreur. printStackTrace();}}
La source du glisser doit également implémenter l'interface DragSourceListener, qui définit les méthodes de gestion des événements pour chaque état lié au glisser-déposer. Tels que dragEnter, dragOver, dropActionChanged, dragExit et d'autres méthodes. Dans cet exemple, la méthode dragEnter() sera implémentée pour définir la forme du curseur lors du déplacement, et les autres méthodes seront des méthodes vides. Le code d'implémentation spécifique est le suivant :
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Méthode dragEnter() pas encore implémentée.");DragSourceContext dsc = dsde.getDragSourceContext( //Obtenir la référence contextuelle de la source de déplacement/); / Définit la forme du curseur lors du déplacement int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
Implémentation de la cible de dépôt : Une instance DragTarget doit être créée en premier dans la classe de cible de dépôt pour indiquer que cette classe est une classe de composant de cible de dépôt ou contient un composant de cible de dépôt. L'implémentation est la suivante :
new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
L'instruction ci-dessus montre que la cible de dépôt est l'objet this.jTextField1, que l'opération glisser-déposer est de type DnDConstants.ACTION_COPY_OR_MOVE et que la classe qui implémente l'interface DropTargetListener est cette classe. Correspondant à DrafSourceListener, la cible de dépôt ou sa classe implémente généralement l'interface DropTargetListener. Cette interface définit également de nombreuses méthodes, telles que dragEnter, dragOver, etc., pour gérer les événements lorsque le processus de glisser-déposer entre dans différentes étapes. Cet exemple ne concerne que la méthode drop(), qui est le traitement des événements lorsque la souris est relâchée sur le composant cible de placement. Elle est généralement utilisée pour traiter les données transmises. Par exemple, dans cet exemple, les données texte transmises seront. affiché sur le composant JTextField Autres La méthode est une méthode vide, le code spécifique est le suivant :
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Method drop() pas encore implémentée.");try{Transferable tr = dtde.getTransferable( //Obtenir l'objet de données transmis/ /); Traitez l'objet de données et obtenez les informations textuelles si (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //Affiche les informations textuelles transmises depuis la source de déplacement sur la cible de dépôt dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
Code du programme :
1. Créez un nouveau projet et nommez-le JDragAndDropDemo.
2. Créez une nouvelle application et nommez-la JDragAndDropDemo ; nommez la fenêtre principale MainFrame et intitulez-la JDragAndDropDemo.
3. Créez une nouvelle classe, nommez-la DragJLabel et héritez de la classe JLabel.
4. Utilisez l'interface Wizards|implements pour que la classe DragJLabel implémente les interfaces DragGestureListener et DragSourceListener.
5. Ajoutez un nouvel attribut DragSource ds dans la classe DragJLabel, le code est le suivant :
la classe DragJLabel étend JLabel implémente DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource( //Créer une instance DragSource...});
6. Écrivez la méthode constructeur de la classe DragJLabel.
public DragJLabel (titre de la chaîne, alignement int) {super (titre, alignement); //Utiliser la méthode de classe parent int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. Implémentez la méthode dragGestureRecognized() dans la classe DragJLabel, encapsulez et envoyez les données.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Méthode dragGestureRecognized() pas encore implémentée.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(Exception err){err.printStackTrace();}}
8. Implémentez la méthode dragEnter() dans la classe DragJLabel pour définir la forme du curseur.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Méthode dragEnter() pas encore implémentée.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. Ajoutez un composant JTextField dans la partie inférieure de la fenêtre de conception de la classe MainFrame, et créez une instance DragJLabel dans la classe. Le code spécifique est le suivant :
classe publique MainFrame étend JFrame implémente DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Hello World!",SwingConstants.CENTER);……}
10. Écrivez la méthode d'initialisation jbInit() de la classe MainFrame, définissez les propriétés initiales du composant et créez une nouvelle instance DropTarget. Le code est le suivant :
private void jbInit() lève une exception {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Votre icône]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(nouvelle Dimension(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(this .label,BorderLayout.NORTH);nouveau DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. Utilisez l'interface Wizards|implements pour que la classe MainFrame implémente l'interface DropTargetListener.
12. Implémentez la méthode drop() héritée de l'interface DropTargetListener pour traiter les données transmises. Le code spécifique est le suivant :
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Méthode drop() pas encore implémentée.");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){ err.printStackTrace();}}