Graphiques

SWT fournit un moteur graphique puissant pour réaliser des graphiques et afficher des images dans des widgets. Vous pouvez aller relativement loin sans programmation de l'interface graphique, du fait que les widgets traitent la mise en couleur des icônes, du texte et d'autres données à votre place. Si votre application affiche des graphiques personnalisés ou si vous implémentez un widget dessiné et personnalisé, vous devez connaître certains objets de dessin de base dans SWT.

Contexte graphique

Le contexte graphique, CG, est le point focal du support graphique de SWT. Son API décrit toutes les capacités de dessin dans SWT.

Un CG peut être utilisé pour dessiner sur un contrôle (cas le plus courant) ou sur une image, un affichage ou une imprimante. Lorsque vous dessinez sur un contrôle, vous utilisez le CG qui vous est fourni dans l'événement de représentation de la commande. Si vous dessinez sur une image, un affichage ou une imprimante, vous devez créer un CG configuré expressément (et le supprimer une fois son utilisation terminée).

Lorsque vous disposez d'un CG, vous pouvez définir ses attributs, par exemple une couleur, l'épaisseur des lignes et la police qui contrôlent l'aspect des graphiques dessinés dans le CG.

La référence d'API pour le CG décrit le jeu complet de fonctions graphiques.

Polices

Les classes Font et FontData sont utilisées lors de la manipulation des polices dans SWT.

FontData décrit les caractéristiques d'une police. Vous pouvez créer une classe FontData en spécifiant un nom, un style et une taille de police. FontData inclut une API permettant de demander ces attributs. Du fait que FontData n'attribue pas de ressources du système d'exploitation, il n'est pas nécessaire de supprimer cette classe.

La classe Font est l'objet graphique réel représentant une police utilisée dans l'API de dessin. Pour créer une police d'affichage , spécifiez l' Affichage, ainsi que la classe FontData de la police souhaitée. Vous pouvez également demander une police pour sa classe FontData.

Vous devez supprimer une police une fois son utilisation terminée.

Couleurs

Les couleurs sont similaires aux polices. Vous créez une couleur pour un affichage en spécifiant les valeurs RVB de la couleur souhaitée. Vous devez supprimer la couleur une fois son utilisation terminée.

La méthode getSystemColor d'affichage permet de demander les couleurs système prédéfinies pour la plateforme du système d'exploitation. Vous ne devez pas libérer de couleurs obtenues via cette technique.

Le modèle de couleur est expliqué en détails à l'article SWT Color Model.

Images

Les classes Image, ImageData et ImageLoader sont utilisées lors de la manipulation d'images dans SWT.

ImageData décrit les pixels réels de l'image, utilisant la classe PaletteData pour décrire les valeurs des couleurs utilisées dans l'image. ImageData est une description de l'image, indépendante du dispositif et de la plateforme.

ImageLoader charge et sauvegarde ImageData sous différents formats de fichier. SWT supporte couramment le chargement et la sauvegarde des formats d'image suivants : BMP (Bitmap Windows), ICO (Icône Windows), JPEG, GIF et PNG.

L'image est l'objet graphique réel représentant l'image utilisée dans l'API de dessin. Une image est créée pour un affichage spécifique. Des images peuvent être créées de plusieurs façons :

Peu importe la méthode choisie pour créer l'image, vous êtes responsable de sa disposition.

Cycle de vie des objets graphiques

La plupart des objets graphiques utilisés pour le dessin dans SWT allouent des ressources du système d'exploitation sous-jacent et doivent être explicitement libérées. La même règle que celle des représentations miniatures abordée précédemment s'applique ici. Si vous le créez à l'aide d'un constructeur, vous devez-le libérer. Si sous y accédez à partir d'un autre endroit, ne le libérez pas.

Création

Des objets graphiques tels que des contextes graphiques, des polices, des couleurs et des images sont alloués dans le système d'exploitation dès que l'objet est créé. Le mode selon lequel vous envisagez d'utiliser vos objets graphiques détermine le moment oùvous devez les créer.

En ce qui concerne les objets graphiques utilisés de manière récurrente dans l'application, vous pouvez les créer lorsque vous créez vos widgets. Cette procédure est couramment utilisée pour les couleurs et les polices. Dans d'autres cas, il est plus approprié de créer vos objets graphiques à la volée. Par exemple, vous pouvez créer un contexte graphique dans l'un de vos gestionnaires d'événements de widget pour effectuer des calculs.

Si vous implémentez un widget personnalisé, vous allouez généralement des objets graphiques dans le constructeur, si vous les utilisez toujours. Vous pouvez les allouer à la volée si vous ne les utilisez pas toujours ou s'ils sont dépendants de l'état de certains attributs.

Traçage

Une fois les objets graphiques alloués, vous êtes prêts à tracer. Effectuez toujours le traçage dans un écouteur de dessin. Dans quelques rares cas (en particulier lors de l'implémentation de widgets personnalisés), vous tracez tout en répondant à d'autres événements. Ceci est généralement déconseillé. Si vous pensez devoir tracer tout en traitant d'autres événements, vous devez d'abord tenter d'utiliser la méthode redraw qui génère un autre événement de traçage dans le système d'exploitation. Dessiner en dehors de la méthode de traçage réduit les performances optimales de la plateforme et peut entraîner des bogues en fonction du nombre de dessins en attente dans la file des événements.

Lorsque vous recevez un événement de traçage, un CG préconfiguré vous est fourni pour dessiner dans le widget. Ne libérez pas ce CG ! Vous ne l'avez pas créé.

D'autres objets graphiques doivent être alloués pendant le traitement de l'événement (ou avant). L'extrait ci-dessous est basé sur l'exemple org.eclipse.swt.examples.HelloWorld5. La couleur rouge a été préalablement allouée lors de la création du widget, aussi peut-elle être utilisée ici.

shell.addPaintListener(new PaintListener () {
    public void paintControl(PaintEvent event){
        GC gc = event.gc;
        gc.setForeground(red);
        Rectangle rect = event.widget.getClientArea();
        gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
        gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
    }
});

Suppression

Chaque objet graphique que vous allouez doit être libéré lorsque vous avez fini de l'utiliser.

Le délai de suppression dépend du moment où vous avez créé l'objet. Si vous créez un objet graphique tout en créant votre widget, vous devez en général ajouter un écouteur de suppression sur le widget et supprimer les graphiques lorsque le widget est supprimé. Si vous créez un objet à la volée en dessinant, vous devez le supprimer une fois le dessin terminé.

L'extrait de code ci-dessous montre une version légèrement modifiée de notre écouteur de dessin. Dans cet exemple, il alloue et libère la couleur rouge pendant le dessin.

shell.addPaintListener(new PaintListener () {
    public void paintControl(PaintEvent event){
        GC gc = event.gc;
        Color red = new Color(event.widget.getDisplay(), 0xFF, 0, 0);
        gc.setForeground(red);
        Rectangle rect = event.widget.getClientArea();
        gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
        gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
        red.dispose();
    }
});