| auteur : Lunatix | SWT est une librairie graphique. C'est-à-dire que 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 objet, et des fonctionnalités supplémentaires.
| |
| auteur : Lunatix | Swing est une api "lightweigth", 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.
| |
| auteur : Lunatix | 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 developpement
- 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 plugins, 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
voila, pas de grande réponse définitive sur quoi utliser, mais on vous avait prévenu.
| |
| auteur : Lunatix | Vous pouvez voir les widget SWT sur cette page : Widgets SWT. Chaque Widget est présenté avec un exemple et sa javadoc.
| |
| auteur : Lunatix | L'équipe de developppement de SWT tient a 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.
| |
| auteur : Lunatix | Pour lancer une application swt, vous devez bien sur avoir les jar swt dans le classpath, mais aussi declarer les librairies natives. Celles-ci se trouvent dans le sous répertoire de plugins 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 sur, vous devrez adapter cette ligne de commande a votre OS, et à la version de swt utilisée, on vous laisse chercher un peu.
| |
| auteur : Lunatix |
Pour inclure du swing dans swt, on a deja parlé de la page d'exemples maintenue par l'equipe de developpement de SWT, c'est typiquement là qu'il faut aller chercher
un bon exemple Ceux qui traitent de ce probleme sont regroupés sous le titre Swing/AWT
Lancer du swt dans swing : La réponse est simple, ce n'est pas possible.
| |
| auteur : Lunatix |
Il est tout simplement fortement déconseillé d'hériter d'un widget swt. En effet, meme 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
qui ne supporte pas forcement l'héritage (gtk est codé en C par exemple). En conséquence chaque widget (sauf bien sur Composite) utilise un mécanisme pour bloquer l'heritage : la une méthode protected void checkSubclass() throws SWTException
dont vous pouvez lire la javadoc Javadoc
Vous allez dire, et le mot clé final il aurait pu servir non ? et bien oui, mais ce systême de check au runtime permet quand meme si vous le voulez vraiment
d'hériter, il suffit de surcharger cette methode dans votre classe, tout cela bien sur à vos risques et périls. Le problème principal vient du fait que si votre widget hérité marche sous une plate-forme, il ne fonctionnera pas forcement sous une autre. Ce mécanisme est prévu surtout pour faire du bugfix sans attendre que cela soit intégré à la distribution officielle de swt, et pas du tout pour ajouter des fonctionnalités
En clair, pas d'héritage de widget en SWT. (il vous reste la composition, ce n'est pas si dramatique)
| |
| auteur : Lunatix | 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)
- et pour finir
jarsigner.exe -keystore myKeyStore -verbose -certs swt.jar myKey jarsigner.exe -keystore myKeyStore -verbose -certs swt-native.jar myKey jarsigner.exe -keystore myKeyStore -verbose -certs myApp.jar myKey - et bien sur, de même avec toutes vos librairies.(jface.jar, etc...)
puis comme fichier .jnlp <?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://www.domaine.com/application" href="myApp.jnlp">
<information>
<title>myApp</title>
<vendor>Lunatix corporation inc</vendor>
<homepage href="http://www.domaine.com/"/>
<description>myApp</description>
<description kind="short">une application de test</description>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.4+"/>
<jar href="myApp.jar"/>
<jar href="jface.jar"/>
<jar href="forms.jar"/>
<nativelib href="swt-native.jar"/>
</resources>
<resources os="Windows">
<jar href="swt.jar"/>
</resources>
<application-desc main-class="com.domaine.myApp.MyApp" />
</jnlp> |
| |
| auteur : Lunatix | Le widget Table de SWT qui est basé sur l'équivalent natif est assez limité. Si vous voulez un composant plus souple utilisez KTable.
| |
Consultez les autres F.A.Q's  
|