IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

accéder au path d'une image avec Transferable


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Par défaut accéder au path d'une image avec Transferable
    Bonjour,

    J'ai un Transferable, t, et j'aimerai récupérer l'adresse physique de l'image sur laquelle j'ai cliqué.
    J'ai utilisé t.getTransferData(flavors[0]).toString() et j'obtiens sun.awt.image.ToolkitImage@145e044. Mais je ne sais pas comment traduire ce texte en chemin physique de l'image.

    Je suis également passé par une ImageIcon et j'obtiens à peu près pareil (javax.swing.ImageIcon@422ede) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Image myImage = (Image)t.getTransferData(flavors[0]) ;
    ImageIcon myIcon = new ImageIcon(myImage);
    Avez-vous une idée ? Merci.

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Par défaut
    Ou alors comment obtenir une adresse du genre javax.swing.ImageIcon@ à partir d'un JLabel peut être ...

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Euh, ma question va etre : qu'appelles-tu le "chemin physique de l'image" ou "l'adresse physique de l'image" ?

    Pour rappel, la method toString() retourne une description textuelle d'un objet qui peut etre d'un format et d'un contenu completement different de ce que tu as actuellement soit en utilisant d'autres types d'objets, soit en utilsant des JVM sur d'autres platformes ou fournies par d'autres vendeurs. Ce n'est donc pas un bon moyen d'esperer decouvrir l'addresse memoire de l'objet en reference (en fait un tel moyen n'existe probablement pas en Java pur).

    Si tu veux parler du chemin d'acces (sur le disque), tu dois alors bien sur le stocker puis l'exporter avec la DataFlavor appropriee en meme temps que l'export de l'image.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Par défaut
    Oui je parlais bien du chemin d'acces (sur le disque).
    Je te remercie bouye pour ton aide, je commençais à desespérer. Je vais essayer de stocker le chemin dans l'image alors.

    Il y a différents types de DataFlavor ?
    Moi j'ai utilisé celle là :
    private final DataFlavor flavors[] = { DataFlavor.imageFlavor };
    Ensuite j'ai la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Object getTransferData(DataFlavor flavor) {
    	if (isDataFlavorSupported(flavor)) {				
    		return image;
    	}
    	return null;
    }
    Donc d'après toi, je peux faire en sorte que mon image puisse avoir un champs supplémentaire ? Lorsque je crée mon ImageIcon et que je la mets dans mon JLabel, c'est là où je dois "surcharger" la classe ImageIcon en lui ajoutant un autre champs ? C'est bien ça ?

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    En effet, comme il existe plusieurs DataFlavor, tu peux exporter une meme donnee sous plusieurs formats (Transferable.getTransferDataFlavors() retourne un tableau de DataFlavor comme tu as du le voir) , dont la saveur DataFlavor.stringFlavor . Et donc quand cette saveur est demandee, l'objet retournee par getTransferData(DataFlavor flavor) est la chaine contenant le chemin d'acces plutot que l'image elle-meme.

    Concernant les images, a ma connaissance (pas trop essaye en fait) pas de solutions simple a part etendre la classe pour rajouter ce champs (quoique lit bien le descriptif des classes BufferedImage, etc... on ne sait jamais). Concernant ImageIcon par contre le chemin peut tres bien etre stocke dans la propriete "name" (getName()) ou "description" (getDescription()) de l'objet.

    EDIT - et si c'est un transfert de l'objet dans la meme JVM, il y a DataFlavor.javaJVMLocalObjectMimeType qui te permet de directement transferer ton ImageIcon sans avoir a la desasembler en une Image + String pour en creer une autre a la reception. A tester.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Par défaut
    Il y a un petit truc que je n'ai pas saisi.
    Quand j'utilise les DataFlavor, est-ce que je peux créer autant de méthodes que je veux afin qu'elles me retournent ce que je désire, par exemple la méthode qui me renvoie un String grâce à DataFlavor.javaJVMLocalObjectMimeType :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public String getTransferDataString(DataFlavor flavor) {
    	if (isDataFlavorSupported(flavor)) {				
    		return javaJVMLocalObjectMimeType ;
    	}
    	return null;
    }
    Mais lorsque je l'utilise String selectedImage = t.getTransferDataString(flavors[0]);, j'ai une erreur à cette ligne m'indiquant qu'il ne trouve pas la méthode que j'utilise :
    cannot find symbol method getTransferDataString(java.awt.datatransfer.DataFlavor)

    Comment cela se fait-il ?

    SOLUTION (à ce problème) : faire directement String selected = myFlavors.javaJVMLocalObjectMimeType;. Et on obtient application/x-java-jvm-local-objectref. Mais je n'ai toujours po l'adresse de mon image sélectionnée du début

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Bon deja, il est normal qu'il ne trouve pas puisque cette methode ne correspond pas a la signature donne dans l'interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object getTransferData(DataFlavor flavor)
    Ensuite tu remarques que dans ton code, c'est toi qui choisis quel saveur tu exportes (c'est toi qui specificies flavors[0] !).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataFlavor[] getTransferDataFlavors()
    Cette methode renvoie une liste des saveurs supportee de la plus riche (en general l'objet lui-meme) a la plus simple (souvent une version texte) (cet orde est specifie dans la doc), car tu peux faire du DnD vers plusieurs cibles :

    - l'objet lui-meme : pour faire du DnD dans l'interface, apparement ce que tu veux.

    - une image : pour faire du DnD sur des composant affichant des images (ImagePanel maison par exemple qui ne supporterai pas ImageIcon), mais aussi des applications externes riches (Word, etc...).

    - une description texte (ici le chemin pour toi) : pour faire du DnD sur des composant ne supportant pas la visu en image par exemple un JTextField mais aussi des application externs simple (Notepad, la console, etc...).

    Par exemple (non-teste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    private ImageIcon target;
     
    /** {@inheritDoc}
     */
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
      if (isDataFlavorSupported(flavor)) {				
        if (flavor == DataFlavor.javaJVMLocalObjectMimeType) {
          return target;
        }	
        else if (flavor == DataFlavor.imageFlavor) {
          return target.getImage();
        }
        else { 
          return target.getName();
        }
     }
     throw new UnsupportedFlavorException(flavor);
    }
    A verifier :
    - si utiliser le == est suffisant ou s'il faut utiliser equals() (je ne penses pas les saveurs ne sont pas clonees ou dupliques a priori).
    - tu peux creer ta propre saveur pour les ImageIcone plutot que d'utiliser DataFlavor.javaJVMLocalObjectMimeType si tu en as l'envie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final DataFlavor IMAGE_ICON_FLAVOR = new DataFlavor(ImageIcon.class, "A DataFlavor for ImageIcon.");
    Ta classe a toi pourrai faire (non teste egalement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    private final DataFlavor[] SUPPORTED_FLAVORS = new DataFlavor[] {
    IMAGE_ICON_FLAVOR, // Ou DataFlavor.javaJVMLocalObjectMimeType si tu ne crees pas ta propres saveur.
    DataFlavor.imageFlavor,
    DataFlavor.stringFlavor };
     
    /** {@inheritDoc}
     */
    public DataFlavor[] getTransferDataFlavors() {
      return SUPPORTED_FLAVORS;
    }
     
    /** {@inheritDoc}
     */
    public boolean isDataFlavorSupported(DataFlavor flavor)  {
     for (DataFlavor f : getTransferDataFlavors()) {
       if (f == flavor) {
         return true;
       } 
     }
     return false;
    }
     
    [...]
     
    // Ailleurs
    ImageIcon icon = null;
    try {
      icon = (t.isDataFlavorSupported(IMAGE_ICON_FLAVOR) ? (ImageIcon)t.getTransferData(IMAGE_ICON_FLAVOR) : null ; // Ou DataFlavor.javaJVMLocalObjectMimeType si tu ne crees pas ta propres saveur.
      if (icon == null) {
        Image image = (t.isDataFlavorSupported(DataFlavor.imageFlavor) ? (Image)t.getTransferData(DataFlavor.imageFlavor) : null;
        String path = (t.isDataFlavorSupported(DataFlavor.stringFlavor) ? (String)t.getTransferData(DataFlavor.stringFlavor) : null;
        icon = (image != null) ? new ImageIcon(image, path) : null;
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    Ah, par contre une erreur de ma part : il n'y a pas de propriete "name" dans ImageIcon, juste la propriete "description".
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Voir aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (ImageIcon.class.isAssignableFrom(flavor.getDefaultRepresentationClass()) {
    [...]
    Ce qui peut te permettre d'eviter de referencer en dur ton type maison a toi.

    Bref, plein de pistes a explorer.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Path d'une image avec XML
    Par zamborta dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 31/05/2013, 01h28
  2. Appeler une image avec absolute path serveur
    Par rmz_a dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 26/10/2007, 10h56
  3. Réponses: 4
    Dernier message: 26/09/2005, 14h27
  4. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo