Bon deja, il est normal qu'il ne trouve pas puisque cette methode ne correspond pas a la signature donne dans l'interface :
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] !).
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) :
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 :
public static final DataFlavor IMAGE_ICON_FLAVOR = new DataFlavor(ImageIcon.class, "A DataFlavor for ImageIcon.");
Ta classe a toi pourrai faire (non teste egalement) :
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".
Partager