JDesktop Integrated Components

Romain Guy (Gfx)

Sun Microsystems a décidé d'aider Java à devenir une technologie indispensable pour le développement d'applications riches. Pour cela, un projet libre a été mis en place sur javadesktop.org, les JDIC, que nous allons découvrir ensemble. ♪

- Titre : JDesktop Integrated Components

- Auteur : Romain Guy (Gfx)

- Parution : 17 juillet 2006

- Licence : Cette création est mise à disposition sous un contrat Creative Commons (Paternité - Partage des Conditions Initiales à l'Identique).

Sommaire

- Introduction

- I. Les composants Desktop, Filetypes et Tray

- II. Le composant Browser

- III. Screenshots

- IV. Les sources de cet article

Introduction

Les JDesktop Integrated Components sont distribués sous licence LGPL et ont pour rôle de permettre aux applications Java d'interagir de façon poussée avec l'environnement de travail d'accueil. Les applications Java disposent aujourd'hui de plusieurs avantages par rapport à des solutions natives. La disponibilité de la plateforme Java sur les principaux systèmes d'exploitation du marché permet aux développeurs de distribuer leurs applications sans modifier leur code. En outre, et malgré leur qualité parfois discutable, les différents « look and feel » de Swing permettent aux solutions Java de se fondre parmi les autres logiciels. Enfin, le déploiement des applications est devenu très simple depuis que Java WebStart est apparu. Un seul clic sur une page web permet maintenant à un utilisateur d'exécuter un logiciel sous Windows, Linux, Solaris ou MacOS X. Ces avantages ne sont malheureusement pas suffisants, car les applications ne peuvent pas, avec une distribution Java standard, accéder à certaines fonctionnalités spécifiques de l'environnement de travail. Il est donc impossible de placer un programme Java dans la zone de notification de GNOME ou de Windows. Pour y remédier, certains développeurs offrent des bibliothèques spécialisées, comme SysTray, reposant sur des appels natifs du système. Ces dernières doivent néanmoins être compilées pour chaque plateforme cible, opération difficile si vous la connaissez mal.
Le premier changement a été amorcé avec la version de Java WebStart fournie avec le J2SE 1.5 qui permet d'associer des fichiers à vos applications WebStart ou d'ajouter des entrées dans les menus de suppression de programmes. Cette intention louable ne satisfait malheureusement pas tous les besoins, et c'est précisément ce à quoi le projet JDIC tente de remédier. Les JDIC fournissent donc un composant HTML natif, la possibilité d'ouvrir des fichiers avec leur programme associé, de lancer le client de courrier électronique par défaut, de créer ses propres associations de fichiers, de créer des économiseurs d'écran, de manipuler la zone de notification et de générer des paquetages RPM, SVR4 ou MSI à partir de descripteurs JNLP pour Java WebStart. Toutes ces fonctionnalités nécessitent des bibliothèques natives qui sont disponibles pour Solaris, Linux et Windows sur http://jdic.javadev.net. Une API Java abstrait les appels pour garantir la portabilité de vos applications.

I - Les composants Desktop, Filetypes et Tray

Parmi les quatre paquetages proposés par JDIC, le premier qui nous intéresse s'intitule org.jdesktop.jdic.browser. Composé de deux classes, Desktop et Mail, il permet d'interagir avec les fichiers de la machine, le navigateur Internet et le client de courrier électronique. Toutes les méthodes de Desktop sont statiques : browse(), edit(), isEditable(), isPrintable(), mail(), open() et print(). Elles permettent respectivement de lancer le navigateur par défaut, d'ouvrir un fichier en mode édition avec son programme associé, de vérifier si un fichier peut être édité ou imprimé, de lancer le client mail, d'ouvrir un fichier avec son programme associé et d'imprimer un fichier. Le listing 1 présente un exemple de programme créant un nouveau mail avec un fichier joint. Enfin, si cela est possible, le fichier est imprimé. Si votre gestionnaire de courrier électronique par défaut est Mozilla Mail, reportez-vous à la section « Installation » du fichier README de JDIC. Vous devrez procéder à quelques manipulations particulières pour permettre à la classe Desktop d'interagir avec lui. La méthode mail(Message) de la version actuelle de JDIC, 0.8.7, ne gère malheureusement toujours pas Thunderbird. Seuls Outlook, Outlook Express, Mozilla Mail et Evolution fonctionnent.
Le deuxième composant JDIC se trouve dans le paquetage org.javadesktop.jdic.filetypes et vous permet d'agir sur les associations de fichiers. Vous pourrez lire ces associations, les créer ou les supprimer en fonction d'une extension de fichier ou d'un type MIME. Ce composant sera très utile pour toutes les applications possédant leur propre format de fichier ou pour des logiciels comme des éditeurs de texte. Le listing 2 présente une application créant une association pour les fichiers .dummy si elle n'existe pas, et la supprimant dans le cas contraire. L'association est créée par l'appel à la méthode registerUserAssociation() qui la crée pour l'utilisateur courant. La méthode registerSystemAssociation() permet de réaliser la même opération au niveau du système. Chaque association se voit attribuer une ou plusieurs actions : open, edit ou print. Sous GNOME, pour Linux et Solaris, seule l'action open peut être enregistrée tandis que Windows accepte les deux autres. Vous pourrez vous référer à la documentation pour découvrir les autres méthodes des classes Action, Association et AssociationService, comme setIconeFileName() qui permet d'attribuer une icône aux fichiers. Bien que le composant FileTypes fonctionne avec les trois systèmes d'exploitation cités précédemment, vous devrez faire attention à certains détails. Ainsi, une commande « open » pour Windows devra préciser le paramètre %1 à la suite du chemin complet vers l'exécutable.
Le troisième composant s'intitule Tray et se trouve dans le paquetage org.javadesktop.jdic.tray. Il vous permet d'ajouter une icône, animée ou non, dans la zone de notification, souvent appelée traybar ou systray, de GNOME et de Windows. Le listing 3 présente un extrait du code affichant une icône munie d'un menu contextuel dans la traybar. La méthode setAutoSize() utilisée ici indique à JDIC de redimensionner l'image pour l'adapter aux spécificités du système. Vous pouvez donc utiliser une icône de grande taille (32x32 pixels par exemple) pour obtenir un affichage correct sous GNOME et Windows. L'écouteur ActionListener permet quant à lui de recevoir les événements émis par un double-clic sur l'icône. Vous pouvez enfin changer les propriétés de l'icône à tout moment : image, bulle d'aide, etc. On peut donc utiliser deux images différentes pour indiquer le statut du programme.

II - Le composant Browser

Le dernier composant appartient au paquetage org.jdesktop.jdic.browser et se trouve dans la classe WebBrowser. Ce composant est un Canvas AWT et doit donc être utilisé avec précaution dans les interfaces Swing. Les composants Swing sont en effet dits légers (ou lightweight) tandis que leurs pendants AWT sont lourds (heavyweight). Cela est très important, car les composants lourds s'affichent toujours par-dessus les légers. Ainsi, si vous ajoutez une barre de menu Swing à une fenêtre contenant un WebBrowser, les menus apparaîtront sous le canvas. Pour corriger ce problème, vous devez appeler la méthode setLightWeightPopupEnabled(false) sur le menu contextuel, obtenu par getPopupMenu(), de vos menus. Vous pouvez rendre tous les menus contextuels de l'application lourds en invoquant la méthode statique setDefautlLightWeightPopupEnabled(false). Le listing 4 présente un extrait du fichier Browser.java qui contient un mininavigateur Internet Swing. Chaque navigateur peut retourner son statut sous forme d'une instance de la classe WebBrowser.Status, retournée par un appel à la méthode getStatus(). Le statut est important pour savoir si le navigateur a terminé son initialisation et si les boutons de navigation précédent et suivant peuvent être ou non activés par l'utilisateur. Vous pouvez également ajouter un WebBrowserListener pour recevoir une grande variété d'événements générés lors de la navigation de l'utilisateur. Vous pourrez ainsi savoir quand le texte de la barre de statut ou de la barre de titre du navigateur est censé changer. JDIC est donc une bibliothèque très simple d'emploi et surtout très portable. La présence du composant WebBrowser vous permettra notamment de proposer des aides intégrées à vos applications avec un rendu bien meilleur que celui offert en standard par Swing.

listing 1

import java.io.*;
import java.util.*;
import org.jdesktop.jdic.desktop.*;

public class Mailer {
public static void main(String[] args) throws Exception {
File file = new File(args[0]);
if (file.exists()) {
List attachments = new ArrayList(1);
attachments.add(file.getAbsolutePath());
List tos = new ArrayList(1);
tos.add("John Doe <john.doe@whatever.poxy>");

Message mail = new Message();
mail.setAttachments(attachments);
mail.setBody("Voici une pièce jointe.");
mail.setSubject(file.getName());
mail.setToAddrs(tos);

Desktop.mail(mail);

if (Desktop.isPrintable(file))
Desktop.print(file);
}
}
}

listing 2

AssociationService service = new AssociationService();
Association assoc = service.getFileExtensionAssociation(".dummy");

if (assoc != null) {
System.out.println("Effacement de l'association.");
service.unregisterUserAssociation(assoc);
} else {
System.out.println("Création de l'association.");
Action action = new Action("open", "/usr/bin/dummy");

assoc = new Association();
assoc.addFileExtension(".dummy");
assoc.addFileExtension(".DUMMY");
assoc.setDescription("Dummy File Type");
assoc.setMimeType("text/dummy");
assoc.addAction(action);
service.registerUserAssociation(assoc);
}

listing 3

JPopupMenu menu = new JPopupMenu("Tuned");
JMenuItem quitMenuItem = new JMenuItem("Quit", new ImageIcon(Tuned.class.getResource("images/menu_quit.gif")));
quitMenuItem.addActionListener(this);
menu.add(quitMenuItem);

ImageIcon inactiveIcon = new ImageIcon(Tuned.class.getResource("images/tuned_inactive.gif"));
SystemTray tray = SystemTray.getDefaultSystemTray();
TrayIcon trayIcon = new TrayIcon(inactiveIcon, "Tuned\nNo new item\nNo check yet", menu);
trayIcon.setIconAutoSize(true);
trayIcon.addActionListener(this);
tray.addTrayIcon(trayIcon);

listing 4

WebBrowser browser = new WebBrowser();
browser.setURL(new URL("http://www.posse-press.com"));

JFrame frame = new JFrame("LoginBrowser");
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.getPopupMenu().setLightWeightPopupEnabled(false);
menu.add(new JMenuItem("A Long"));
// ...
bar.add(menu);
frame.setJMenuBar(bar);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(BorderLayout.CENTER, browser);
frame.pack();
frame.setSize(800, 600);
frame.setVisible(true);

III - Screenshots

Le composant Tray permet d'afficher des icônes et des menus dans la zone de notification en bas à droite par défaut.

Le composant Browser donne enfin à Swing un moteur de rendu HTML décent.

Les exemples de JDIC présentent chaque composant, comme Desktop qui peut ouvrir le programme associé à une extension de fichier.

JDIC permet de réaliser un véritable explorateur de fichier en Swing.

Le composant de rendu HTML fourni avec Swing est de piètre qualité et ne gère qu'une petite partie des balises.

Le toolkit SWT d'IBM offre depuis longtemps des fonctionnalités proches de l'environnement d'accueil, notamment pour les moteurs de rendu HTML.

Les JDIC sont un projet libre hébergé sur javadesktop.org. Ce site accueille un grand nombre de projets de bibliothèques de composants ou d'applications riches en Java.

IV - Les sources de cet article

- Dummy.java

- Browser.java

- Mailer.java