next up previous contents index
Next: 36 Java2D Up: Java: JFC Previous: 34 Gestion des évènements

Subsections

35 Transfert de données

35.1 Introduction

Java fournit avec le package Java.awt.datatransfer des facilités pour le transfert de données au sein d'une même application ou entre différentes applications. Par exemple, une application Java peut utiliser le presse papier (Clipboard ) en exporter ou importer des données.

L'architecture retenu pour Java obéit aux exigences suivantes:

35.1.1 Données et type de données

Tranférer des données nécessite de connaître de type de données. Les données peuvent apparaître sous diverses formes:

Et chacune de ces données peut apparaître sous différents formats; Java utilise le terme de flavor pour désigner les formats.

Un exemple typique de formats différents pour un même type de données concerne les formats reconnus par un formateur de texte comme Word :

Un format est représenté par un objet de type java.awt.datatransfer.DataFlavor qui se compose des informations suivantes:

Il existe deux formats de données prédéfinis dans JDK 1.1 :

 

A TERMINER

35.1.2 Objets transférables

Un objet transférable est une instance d'une classe qui implante l'interface java.awt.datatransfer.Transferable. Cette interface doit définir une liste de formats (DataFlavor) pour des données. Ces formats sont ordonnés du plus complexe au plus simple. De plus, un tel objet doit pouvoir fournir une donnée selon un format spécifié ou signaler que le format n'est pas connu pour cet objet.

Il existe, pour des facilité la vie du programmeur, des classes prédéfinies. Un exemple d'une telle classe est la classe java.awt.datatransfer.StringSelection.

35.1.3 Le presse papier

Le presse papier ((Clipboard ) définit un mécanisme standard pour implanter les opérations couper/copier/coller (cut/copy/paste). On peut soit créer des presses papier privées ou utiliser le presse papier du système hôte. Ce dernier permet de tranférer des données entre applications Java et non-Java.

Un Clipboard est un objet, partagé par plusieurs clients, susceptible de contenir un objet Transferable. A tout moment, un seul client est proprétaire du Clipboard : c'est le dernier client à y avoir stocké une donnée. Lorsqu'un client perd la propriété du Clipboard, celui-ci reçoit une notification par l'invocation de la méthode lostOwnership de l'interface java.awt.datatransfert.ClipboardOwner.

35.2 l'API java.awt.datatransfer

Ce package java.awt.datatransfer comprend

35.3 Transfert de chaînes de caractères

La classe Clipboard contient deux méthodes getContents et setContents qui permettent d'interagir avec le presse papier.

La classe Toolkit possède la méthode getSystemClipboard qui retourne une référence vers le presse papier du système utilisé.

Dans l'applet qui suit, vous devrez pouvoir importer et exporter le contenu du presse papier de votre système.

<applet codebase="Programmes/awt/transfert" code=AppletClip.class width = 300 height= 150 alt = "Votre browser ne peut exécuter cet applet" align = top vspace = 10 hspace = 10 > Votre browser ne peut exécuter les applets Java <p ALIGN=CENTER><IMG SRC="dessin/AppletClip.gif"></br> Transfert du et vers le presse papier</p> </applet>

 

   import java.awt.*;
   import java.io.*;
   import java.awt.datatransfer.*;
   import java.awt.event.*;
   import java.applet.*;
   public class AppletClip extends Applet {
      TextField textField = new TextField();
      TextDisplay textDisplay = new TextDisplay(textField);
      public void init() {
         setLayout(new BorderLayout());
         add(textDisplay, BorderLayout.CENTER);
         add(textField, BorderLayout.SOUTH);
      }
   }

   class TextDisplay extends Canvas implements TextListener {
      String text = "";
      TextField textField;
      Font f = new Font("Monospaced", Font.BOLD, 24);   
      Clipboard cb = getToolkit().getSystemClipboard();
   
      TextDisplay(TextField textField) {
         this.textField = textField;
         setFont(new Font("Monospaced", Font.BOLD, 24));
         addMouseListener(new MouseEventHandler());
         textField.addTextListener(this);
      }
   
      public void paint(Graphics g) {
         FontMetrics fm = getFontMetrics(f);
         g.setFont(f);
         g.drawString(text, (getSize().width-fm.stringWidth(text))/2,
            (getSize().height-fm.getHeight())/2+fm.getAscent());
      }
   
      public void textValueChanged(TextEvent e)  { 
         StringSelection c = new StringSelection(textField.getText());
         cb.setContents(c, c);
      }
   
      class MouseEventHandler extends MouseAdapter {
         public void mousePressed(MouseEvent evt) {
            Transferable t = cb.getContents(this);
            try {
               if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
                  text =  (String)t.getTransferData(DataFlavor.stringFlavor);
               else text = "Presse papier vide ou ne contient pas une chaîne";
               textField.setText(text);   
            } 
            catch (UnsupportedFlavorException e)  { e.printStackTrace(); }
            catch (IOException e)  { e.printStackTrace(); }
            repaint();
         }
      }
   }


Récupérer des données du presse papier

Stocker des données dans le presse papier

35.4 Personaliser ses propres données de transfert

<applet codebase="Programmes/awt/transfert" code=TabChaines.class width = 400 height= 300 alt = "Votre browser ne peut exécuter cet applet" align = top vspace = 10 hspace = 10 > Votre browser ne peut exécuter les applets Java <p ALIGN=CENTER><IMG SRC="dessin/TabChaines.gif"></br> Transfert d'un tableau de chaînes</p> </applet>

 

   import java.awt.*;
   import java.awt.datatransfer.*;
   import java.awt.event.*;
   import java.io.*;
   import java.applet.*;

   public class TabChaines extends Applet implements ActionListener {
      static Clipboard cb = new Clipboard("Clipboard Principal");
      List lst ;
      TextArea textArea;
      String rc = System.getProperty("line.separator");
   
      public void init() {
         setLayout(new BorderLayout());
      
         Button copy = new Button("Copy");
         add(copy, "South");
         copy.addActionListener(this);
      
         Button coller = new Button("Coller");
         add(coller, "North");
         coller.addActionListener(this);
      
         Panel p = new Panel();
         add(p, "Center");
      
         textArea = new TextArea();
         p.add(textArea);
      
         lst = new List(4, true); 
         lst.add("Lune");  
         lst.add("Mars");   
         lst.add("Mercure");   
         lst.add("Jupiter"); 
         lst.add("Venus");     
         lst.add("Saturne"); 
         lst.add("Soleil");  
         lst.add("Terre"); 
         lst.add("Pluton");
         p.add(lst);
      }
   
      public void actionPerformed(ActionEvent e) {
         if (e.getActionCommand().equals("Copy")) 
            copier();
         else  if (e.getActionCommand().equals("Coller")) 
            coller();
      }
   
      private void coller() {
         Transferable t = cb.getContents(this);
      
        // Make sure the clipboard is not empty.
         if (t == null) {
            System.out.println("The clipboard is empty.");
            return;
         }
         try {
            String[] strs = (String[])t.getTransferData(
                              IntegersSelection.arrayFlavor);
         
            System.out.println(strs);
            for (int i=0; i<strs.length; i++) 
               afficher(strs[i] + " ");
            afficher(rc + "-------------------" + rc);
         } 
            catch (IOException e) {
               afficher("Données non disponible");
            } 
            catch (UnsupportedFlavorException e) {
               afficher("DataFlower de mauvais type");
            }     
      }
   
      private void copier() {
         cb.setContents(new IntegersSelection(lst.getSelectedItems()), null);
      }
      void afficher(String s) {
         textArea.append(s);
         textArea.setCaretPosition(2000); 
      } 
   }

   class IntegersSelection implements Transferable {
      static DataFlavor arrayFlavor;
      String[] strs;
      static {
         try { 
            arrayFlavor = new DataFlavor(Class.forName("[Ljava.lang.String;"), "Tableau de String");
         } 
            catch (ClassNotFoundException e) { 
            }
      }
      DataFlavor[] flavors = {
         arrayFlavor};
   
      IntegersSelection(String[] strs) { 
         this.strs = strs; }
   
      public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
         if (flavor.equals(arrayFlavor)) 
            return strs;
         else 
            throw new UnsupportedFlavorException(flavor);
      }
   
      public DataFlavor[] getTransferDataFlavors() { 
         return flavors; }
   
      public boolean isDataFlavorSupported(DataFlavor flavor) { 
         return flavor.equals(arrayFlavor); }
   }

35.5 Formats Multiples

 

A TERMINER

35.6 Transfert d'images

 

A TERMINER

35.7 Drag and Drop

L'objectif du Drag and Drop est permettre de faire glisser des objets à l'intérieur d'une même application ou mieux encore d'une application à une autre application - application Java ou native.

Une opération classique de Drag and Drop se décompose en les trois états suivants:

35.7.1 La source

La source est un composant à partir de laquelle une opération de Drag peut être effectué. Pour qu'un composant puisse permettre cette opération, il faut qu'il implante l'interface java.awt.dnd.DragSource.

Cette interface permet de préciser:

35.7.2 La destination

35.7.3 Les actions associées au Drag and Drop

35.7.4 Transfert de données et Drag and Drop

35.7.5 Drag and Drop multiple

35.8 l'API Drag and Drop

La gestion du Drag and Drop se fait l'aide du pachage java.awt.dnd. On trouve dans ce package les


next up previous contents index
Next: 36 Java2D Up: Java: JFC Previous: 34 Gestion des évènements
Touraivane
6/12/1998