SWT est une librairie graphique. C'est-à-dire qu'au même titre que AWT, ou Swing, elle va vous permettre de générer
des interfaces graphiques pour vos applications java. La particularité de SWT est de déléguer à la couche graphique du
systême d'exploitation sur lequel est executée l'application les fonctions d'affichage. En clair, vous utilisez les MFC, Gtk ou autre à travers
SWT.
JFace est une surcouche de SWT. Cette librairie amène une couche plus orienté objet, un modèle MVC et des fonctionnalités supplémentaires.
Swing est une API "lightweight", c'est-à-dire qu'elle redessine tous les composants graphiques (widgets) à l'aide des primitives de java2D. SWT
au contraire utilise les API graphiques du système d'exploitation : ses widgets sont dessinés directement par le système d'exploitation. En clair et de façon synthétique
pour afficher un bouton, Swing va dessiner un rectangle, placer le label au millieu tandis que SWT va demander au système de le faire.
Sous SWT, chaque objet java représentant un élément graphique n'est qu'un wrapper vers du code natif.
Petit préambule rapide: Ce sujet peut declencher de grands debats et de terribles contreverses. Ici l'idée n'est que de présenter quelques pistes de reflexion pour vous aider à orienter votre choix
et pas de donner une réponse définitive.
Avantages de SWT
Non standard : vous pouvez distribuer vous même SWT avec votre application ce qui permet de gérer finement le versioning, de bénéficier rapidement des bugFixs et des mises à jour
Natif : SWT s'adapte automatiquement au look and feel du système d'exploitation. Une application java sous SWT va s'adapter automatiquement à un windows customisé à l'extreme, ou à un Gtk avec thème exotique
Petite API : SWT est une petite API, avec un nombre limité de widgets, et peu d'héritage, ce qui en fait une API facile à prendre en main
Consomation mémoire : la consomation mémoire de SWT est plus faible que celle de Swing
Vous pouvez bénéficier du projet Eclipse RCP comme framework de développement
Open Source
Linkable : si vous prévoyez de compiler votre application avec GCJ et Gnu-Classpath, il est possible d'utiliser SWT facilement (il existe une version de Eclipse native)
Bonne intégration : possibilité d'utiliser COM, des plug-ins, le browser web natif pour rendre du html
Inconvénients de SWT
Non standard : vous devez distribuer vous même SWT avec votre application ce qui va alourdir votre distribution et parfois compliquer le deploiement
Non standard : moins de compétences sur SWT, moins de doc, moins d'aide sur le forum de DVP
Natif : on subit les limitations de la plate-forme sous-jacente (taille maximum d'un champ texte, nombre d'image, pas de centrage des champs header des tables etc..)
Gestion mémoire : il est nécessaire de faire un .dispose() sur tous les éléments graphiques pour liberer la mémoire du composant natif qu'il représente
Petite API : SWT/Jface est une petite API, et il manque des choses comparé à Swing
Portabilité : Comparée à Swing et à la version windows, La version Gtk de SWT reste lente (plus d'info)
Pas d'applet possible
Pas de sandBox possible dans java webstart à cause des accès natifs
Voilà, pas de grande réponse définitive sur quoi utiliser, mais on vous avait prévenu.
L'équipe de développpement de SWT tient à jour une page d'exemples
swt-home.
Vous pourrez y trouver des exemples d'utilisation de chacun des widgets SWT, ainsi que la réponse à des questions plus complexes
comme comment lancer une tache longue dans un thread,
gérer le drag and drop etc.
Pour lancer une application SWT, vous devez bien sûr avoir les jar SWT dans le classpath, mais aussi declarer
les librairies natives. Celles-ci se trouvent dans le sous répertoire de plug-ins org.eclipse.swt.[OS]
Sous Eclipse 3.1M5+ : il suffit de choisir dans le menu run -> application SWT
Sous Eclipse : Run -> Run Java Applicaton -> New -> Arguments -> VM Arguments ajouter
-Djava.library.path=c:\eclipse\plugins\org.eclipse.swt.win32_2.1.0\os\win32\x86
Enfin pour le distribuer vous devez ajouter dans la ligne de commande
-Djava.library.path=chemin_vers_librairies
Bien sûr, vous devrez adapter cette ligne de commande a votre OS, et à la version de SWT utilisée, on vous laisse chercher un peu.
Dans les versions récentes d'Eclipse, pour lancer une application SWT, il suffit juste d'ajouter le jar de SWT correspondant à votre architecture (org.eclipse.swt.gtk.linux.x86_3.4.0.xxx.jar par exemple pour Linux/x86)
Ce jar peut être récupéré du dossier plug-ins de votre installation Eclipse.
Pour inclure du Swing dans SWT, on a deja parlé de la page d'exemples maintenue par l'équipe de développement de SWT,
c'est typiquement là qu'il faut aller chercher
un bon exemple Ceux qui traitent de ce problème sont regroupés sous le titre Swing / AWT
Lancer du SWT dans Swing : La réponse est simple, ce n'est pas possible.
Il est fortement déconseillé d'hériter d'un widget SWT.
En effet, même si SWT est une API java, les objets que l'on utilise ne sont que des représentations du code natif d'un toolkit graphique.
De fait, l'héritage n'est pas forcément supporté (Gtk est codé en C par exemple).
En conséquence, chaque widget (sauf bien sûr 'Composite') utilise un mécanisme pour bloquer l'héritage : la une méthode protected void checkSubclass() throws SWTException.
Cf. la Javadoc Javadoc
Peut-être vous posez-vous la question de savoir pourquoi le mot clé final n'a pas été utilisé dans ce genre de cas ?
Tout simplement parce que le systême de check au runtime n'empêche pas l'héritage. Ce qui fait qu'en cas de nécessité, il suffit
de surcharger cette méthode dans votre classe.
Cependant, en choisissant cette option, vous vous exposez à des problèmes de non portabilité car si votre widget hérité fonctionne
sur une plate-forme, il peut ne pas fonctionner sur une autre. Donc, à vous de savoir si ça vaut le coup de passer par l'héritage.
L'utilisation de ce mécanisme est à réserver pour faire du bugfix, sans attendre que cela soit intégré à la distribution officielle de SWT.
Il ne faut pas s'en servir en revanche pour ajouter des fonctionnalités.
En clair, pas d'héritage de widget en SWT. La solution est d'utiliser la composition.
La présence des librairies natives de SWT va vous forcer à signer vos jar afin de pouvoir
sortir de la sandbox de java webstart. Pour cela, il faut préparer un jar de votre application (myApp.jar), un jar avec
les librairies natives (swt_win32.dll sous windows) que l'on va nommer swt-native.jar et avoir sous la main swt.jar.
keytool -genkey -keystore myKeyStore -alias myKey : pour générer votre propre certificat
donnez à myKeyStore le nom que vous voulez pour votre keyStore
donnez à myKey le nom que vous voulez pour votre clée key
(repondez aux questions ... et n'oubliez pas le mot de passe, et repondez yes à la derniere question
ensuite : keytool -selfcert -alias myKey -keystore myKeyStore (check the password)
Il n'y a pas de calendrier ni de widget dédié aux dates dans SWT. Il faut donc utiliser des librairies
supplementaires swt-controls swtcalendar swt-datepicker