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:
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 :
application/x-java-serialized-object; class=[Java class]
application/<mime-subtype>; class=java.io.InputStream
A TERMINER
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.
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.
Ce package java.awt.datatransfer comprend
Interface ClipboardOwner { public void lostOwnership(Clipboard cb, Transferable contenu); }
Interface Transferable { Object getTransferData(DataFlavor flavor); DataFlavor[] getTransferDataFlavors(); boolean isDataFlavorSupported(DataFlavor flavor); }
Cette classe implante les fonctionnalités liés au effacer/copier/coller/ (cut/copy/paste ).
public class Clipboard { protected ClipboardOwner owner protected Transferable contents public Clipboard(String name) public String getName() public void setContents(Transferable contents, public Transferable getContents(Object requestor) }
public class DataFlavor { public static final DataFlavor stringFlavor public static final DataFlavor plainTextFlavor public DataFlavor(String primaryType, String subType, MimeTypeParameterList params, Class representationClass, String humanPresentableName) public DataFlavor(Class representationClass, String humanPresentableName) public DataFlavor(String mimeType, String humanPresentableName) public DataFlavor(String mimeType) throws MimeTypeParseException, ClassNotFoundException public DataFlavor() public String getMimeType() public Class getRepresentationClass() public String getHumanPresentableName() public String getPrimaryType() public String getSubType() public String getParameter(String paramName) public void setHumanPresentableName(String humanPresentableName) public boolean equals(Object o) public boolean equals(MimeType mt) public boolean equals(DataFlavor dataFlavor) public boolean equals(String s) public boolean isMimeTypeEqual(String mimeType) public final boolean isMimeTypeEqual(DataFlavor dataFlavor) public boolean isMimeTypeEqual(MimeType mtype) public boolean isMimeTypeSerializedObject() public boolean isRepresentationClassInputStream() public boolean isRepresentationClassSerializable() public void writeObject(ObjectOutputStream oos) throws IOException public void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException public Object clone() throws CloneNotSupportedException protected String normalizeMimeTypeParameter(String parameterName, String parameterValue) protected String normalizeMimeType(String mimeType) }
public class StringSelection { implements Transferable, ClipboardOwner public StringSelection(String data) public DataFlavor[] getTransferDataFlavors() public boolean isDataFlavorSupported(DataFlavor flavor) public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException public void lostOwnership(Clipboard clipboard, Transferable contents) }
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(); } } }
Clipboard cb = getToolkit().getSystemClipboard();
Transferable t = cb.getContents(this);
try { text = (String)t.getTransferData(DataFlavor.stringFlavor); } catch (UnsupportedFlavorException e) { ... } catch (IOException e) { ... }
Clipboard cb = getToolkit().getSystemClipboard();
StringSelection c = new StringSelection(textField.getText());
cb.setContents(c, c);
<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); } }
A TERMINER
A TERMINER
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:
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:
La gestion du Drag and Drop se fait l'aide du pachage java.awt.dnd. On trouve dans ce package les