Drag & Drop avec Style et l'API Swing

Sous-titre

Drag n' Ghost : Démonstration de Drag & Drop avec l'API Swing.

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Démonstration avec Java Web Start

Prérequis : Pour essayer cette démonstration vous devez disposer de Java Web Start (compris avec le JRE et le JDK).

Image non disponible Lancez la démonstration

II. Explications

Une manière très sympa de créer des interfaces graphiques user friendly est de permettre de faire du drag & drop de tout ce que l'on veux dans, depuis et à l'intérieur même de l'application. MacOS X est l'exemple parfait d'une bonne utilisation de drag & drop. A chaque fois que j'ai essayé de dragger quelque chose et de le dropper dans quelque chose d'autre, ca a marché. Sauf biensûr si vous essayez de faire quelque chose de stupide du style dropper un fichier texte sur l'icône d'un jeu. Biensûr Windows et Linux permettent aux applications d'implémenter du drag & drop, mais il leur manque quelque chose que MacOS X offre déjà : des effets visuels vraiment cools. Par exemple, dragger une image depuis Safari, le navigateur web, vous laisse voir une jolie vignette translucide de l'objet.

Comment pouvons nous nous débarasser des curseurs de drag & drop simplistes offerts par Java ? La solution réside dans la démo Drag n' Ghost que je vais vous montrer. Voyez par vous même, vous n'aimez pas cette jolie image translucide ?

Image non disponible

Dragger une image c'est bien, mais ce ne serait pas mieux de pouvoir dragger n'importe quel composant tout en gardant ce bel effet ? Aucun problème :

Image non disponible

Toujours pas convaincus ? Voyons à quoi ca ressemble de dragger toute une JTable :

Image non disponible

Maintenant que j'ai votre attention, voyons voir comment utiliser ca dans vos applications. L'astuce est d'utiliser un glass pane pour dessiner l'image translucide es composants par dessus l'UI. Vous devez donc mettre un GhostGlassPane à la fenêtre et attacher un GhostDropAdapter et un GhostMotionAdapter au composant que vous voulez dragger :

 
Sélectionnez
GhostGlassPane glassPane = new GhostGlassPane();
setGlassPane(glassPane);
JLabel label = new JLabel("Component adapted");
label.addMouseListener(new GhostComponentAdapter(glassPane, "action_1"));
label.addMouseMotionListener(new GhostMotionAdapter(glassPane));
JButton button = new JButton("Picture adapted");
label.addMouseListener(new GhostPictureAdapter(glassPane, "action_2", "image.png"));
label.addMouseMotionListener(new GhostMotionAdapter(glassPane));

Et voilà, c'est aussi simple que ca. Vous pouvez noter que nous n'utilisons pas GhostDropAdapter mais ses deux sous-classes GhostComponentAdapter et GhostPictureAdapter. La première crée l'image fantôme en dessinant le composant source dans une image offscreen alors que la seconde utilise l'image fantôme que vous lui fournissez.

Chaque GhostDropAdapter peut enregistrer des GhostDropListeners qui sont invoqués lors du drop. L'évènement est une instance de GhostDropEvent qui vous donne le nom de l'action et la localisation du drop. Tant que cette position est dans les coordonnées de l'écran, il est conseillé d'utiliser AbstractGhostDropManager qui propose deux méthodes intéressantes.

Un tel manager est attaché à un composant (voir le constructeur) appelé la cible. Deux méthodes vous permettent de gérer le composant : isInTarget() vérifie si la position du drop est à l'intérieur des bornes du composant cible et getTranslatedPoint() traduit les coordonnées écran dans le système de coordonnées de la cible. GhostDropManagerDemo vous montre comment créer un manager personnalisé. Dans cet exemple, le manager attends un drop sur la JTable et montre le nom de l'action :

Image non disponible

Cependant, l'ensemble des composants GhostDrop souffrent de deux problèmes. Tout d'abord, les performances peuvent être très mauvaises quand vous draggez un ghost sur une grande fanêtre. Je ne l'ai vu se produire que sur mon ordinateur, mais je ne doute pas que celà peut se produire aussi sur les votres. Je ne vois pas comment optimiser le rendu à part peut-être utiliser une VolatileImage (et je ne suis pas certain du résultat). Le second problème se produit quand le focus est donné à une autre fenêtre alors que vous êtes en train de dragger quelque chose. Je pense que celà peut être résolu très facilement en écoutant le focus de la fenêtre parent.

III. Téléchargements

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Articles et tutoriels Java
L'essentiel de Java en une heure
L'API java.nio du JDK 1.4
Inversion de contrôle en Java
L'introspection
Le Java Community Process
Conception de tests unitaires avec JUnit
Les Strings se déchaînent
Présentation de SWT
La programmation réseau en Java avec les sockets
Du bon usage de l'héritage et de la composition
Les références et la gestion de la mémoire en Java
Constructeurs et méthodes exportées en Java
Les membres statiques, finaux et non immuables en Java
Les classes et objets immuables en Java
Comprendre et optimiser le Garbage Collector
Les principes de la programmation d'une interface graphique
Les opérateurs binaires en Java
Prenez le contrôle du bureau avec JDIC
Les Java Data Objects (JDO version 1.0.1)
La persistance des données avec Hibernate 2.1.8
Journalisation avec l'API Log4j
Java 5.0 et les types paramétrés
Les annotations de Java 5
Java 1.5 et les types paramétrés
Créer un moteur de recherche avec Lucene
Articles et tutoriels Swing
Threads et performance avec Swing
Rechercher avec style en utilisant Swing
Splash Screen avec Swing et Java3D
Drag & Drop avec style en utilisant Swing
Attendre avec style en utilisant Swing
Mixer Java3D et Swing
Articles et tutoriels Java Web
Redécouvrez le web avec Wicket
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Romain Guy. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.