Présentations

Nous avons vu quelques exemples simples qui montrent comment redimensionner ou positionner les widgets enfants en fonction de la taille du parent. Jusque là, ce type de calcul s'est produit en réponse à un écouteur de redimensionnement. Il s'agit souvent du meilleur moyen pour traiter le positionnement de simples widgets. Cependant, il existe des schémas courants utilisés par les applications lors du placement des widgets. Ces schémas peuvent être structurés sous forme d'algorithmes de présentation qui peuvent être réutilisés par différentes applications.

SWT définit les présentations qui fournissent le positionnement et le dimensionnement des widgets enfants d'un composite. Les présentations sont des sous-classes de la classe abstraite Layout. Les présentations standard de SWT figurent dans le package org.eclipse.swt.layout.

Concepts de présentation des widgets

Vous devez comprendre quelques définitions générales lorsque vous redimensionnez et positionnez les widgets.

Ces concepts sont liés aux applications qu'une présentation soit ou non utilisée. Vous pouvez envisager une présentation comme moyen adéquat pour regrouper les fonctionnalités de redimensionnement à des fins de réutilisation.

Certains concepts supplémentaires sont introduits par des présentations.

Pour plus d'informations et obtenir des illustrations de ces concepts, reportez-vous à l'article Understanding Layouts in SWT.

L'extrait de code ci-dessous illustre le simple cas d'une application utilisant un rappel de redimensionnement pour dimensionner un libellé à la taille de son shell parent.

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.addControlListener(new ControlAdapter() {
    public void controlResized(ControlEvent e) {
        label.setBounds (shell.getClientArea ());
    }
});

L'extrait suivant utilise une présentation pour parvenir au même effet :

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.setLayout(new FillLayout());

Même dans le cas de ce simple exemple, l'utilisation d'une présentation réduit le code d'application. Pour des présentations plus complexes, la simplification est bien plus grande.

SWT fournit trois classes de présentation par défaut qui peuvent être utilisées dans de nombreuses situations.

FillLayout

FillLayout est la classe de présentation la plus simple. Elle présente les widgets sur une seule ligne ou colonne, les forçant à être de la même taille. A l'origine, les widgets sont tous aussi grands que le widget le plus grand, et aussi large que le plus large. FillLayout ne renvoie pas à la ligne et ne vous permet pas de spécifier de marge, ni d'espacement.

Vous pouvez utiliser FillLayout pour présenter des boutons sur une barre de tâches ou une barre d'outils ou pour empiler des cases à cocher dans un groupe. FillLayout peut être également utilisé lorsqu'un composite n'a qu'un seul enfant. Dans l'exemple ci-dessus, FillLayout incite le libellé à remplir complètement son shell parent.

RowLayout

RowLayout présente toujours les widgets en lignes, mais est plus flexible que FillLayout. Les widgets peuvent être renvoyés à la ligne, créant autant de lignes que nécessaire pour les afficher. Il fournit également des marges configurables de chaque côté de la présentation, ainsi qu'un espace configurable entre les widgets. Vous pouvez compacter une classe RowLayout qui forcera tous les widgets à être de la même taille. Si vous justifiez une classe RowLayout, l'espace supplémentaire restant dans le composite sera alloué aux marges situées entre les widgets.

La hauteur et la largeur de chaque widget dans une classe RowLayout peuvent être spécifiées dans un objet RowData devant être défini dans le widget à l'aide de setLayoutData.

GridLayout

GridLayout est la présentation la plus puissante (et la plus complexe).GridLayout présente les widgets dans une grille, fournissant de nombreux paramètres configurables qui permettent de contrôler le comportement des lignes et des colonnes de la grille lorsque le composite est redimensionné.

La classe GridLayout définit l'API qui contrôle la stratégie de présentation globale. L'attribut le plus important est numColumns qui détermine la dimension horizontale de la grille. En règle générale, vous choisissez cette valeur la première fois que vous concevez l'aspect de votre fenêtre. L'ordre des widgets dans la grille est le même que celui suivi pour les créer. Pour modifier l'ordre des widgets dans la grille, vous pouvez utiliser les méthodes de contrôle moveAbove(Control) et moveBelow(Control). Ces méthodes permettent aux widgets d'être insérés avant ou après l'un ou l'autre dans la présentation. ("Above" (au-dessus) et"below" (en dessous) font référence au positionnement Z des widgets et non à l'emplacement dans la grille elle-même.)

Le tableau ci-dessous résume les paramètres configurables pour une classe GridLayout.

Attribut

Description

horizontalSpacing

Nombre de pixels entre le bord droit d'une cellule et le bord gauche de sa cellule voisine.

makeColumnsEqualWidth

Spécifie si toutes les colonnes doivent être forcées d'avoir la même largeur.

marginWidth

Nombre de pixels utilisés pour la marge sur les bords droit et gauche de la grille.

marginHeight

Nombre de pixels utilisés pour la marge sur les bords supérieur et inférieur de la grille.

numColumns

Nombre de colonnes à utiliser pour constituer la grille.

verticalSpacing

Nombre de pixels entre le bord inférieur d'une cellule et le bord supérieur de sa cellule voisine.

GridLayout supporte de nombreux autres paramètres de présentation pour chaque widget de la grille. Ces propriétés sont spécifiées dans un objet GridData. Vous devez définir un objet GridData comme données de présentation pour chaque widget de la grille.

La classe GridData définit des constantes de style qui vous permettent de spécifier des combinaisons de paramètres de présentation communément utilisés dans le constructeur GridData. Vous pouvez également définir ces attributs individuellement à l'aide de méthodes publiques dans GridData.

Vous pouvez parvenir à des présentations hautement dynamiques et complexes à l'aide de GridData. L'association de ces valeurs à différents widgets de la grille peut produire des combinaisons de présentation différentes. Même la présentation de la boîte de dialogue la plus complexe peut être spécifiée à l'aide de GridData. La capacité à permettre aux widgets de s'étendre sur plusieurs cellules résulte en de nombreuses présentations qui ne ressemblent même pas à une grille.

Le tableau ci-dessous résume les paramètres configurables pour GridData. Pour une description détaillée et des exemples de captures d'écran utilisant les divers paramètres de grille, reportez-vous à l'article Understanding Layouts in SWT.

Attribut

Description

grabExcessHorizontalSpace

Spécifie si une cellule doit s'agrandir pour utiliser tout espace horizontal supplémentaire disponible dans la grille. Une fois les dimensions de la cellule dans la grille calculées en fonction des widgets et de leurs données, tout espace supplémentaire restant dans le composite est alloué aux cellules qui peuvent s'approprier l'espace excédant.

grabExcessVerticalSpace

Spécifie si une cellule doit s'agrandir pour utiliser tout espace vertical supplémentaire disponible dans la grille.

heightHint

Spécifie la hauteur minimale du widget (et de ce fait, de la ligne qui le contient).

horizontalAlignment

Ce paramètre peut avoir l'une des valeurs suivantes : BEGINNING, CENTER, END, FILL. FILL signifie que le widget est redimensionné pour occuper toute la largeur de sa cellule dans la grille.

horizontalIndent

Nombre de pixels entre le widget et le bord gauche de sa cellule de grille.

horizontalSpan

Spécifie le nombre de colonnes dans la grille sur lesquelles le widget doit s'étendre. Par défaut, un widget occupe une cellule dans la grille. Il peut occuper des cellules supplémentaires dans le sens horizontal si cette valeur est augmentée.

verticalAlignment

Ce paramètre peut avoir l'une des valeurs suivantes : BEGINNING, CENTER, END, FILL. FILL signifie que le widget est redimensionné pour occuper toute la hauteur de sa cellule dans la grille.

verticalSpan

Spécifie le nombre de lignes dans la grille sur lesquelles le widget doit s'étendre. Par défaut, un widget occupe une cellule dans la grille. Il peut occuper des cellules supplémentaires dans le sens vertical si cette valeur est augmentée.

widthHint

Spécifie la largeur minimale du widget (et de ce fait, de la colonne qui le contient).

Présentations personnalisées

A l'occasion, il se peut que vous deviez écrire votre propre classe de présentation personnalisée. Ceci s'applique plus particulièrement lorsqu'une présentation complexe est utilisée à de nombreux endroits de votre application et peut s'avérer plus approprié lorsque vous pouvez optimiser la présentation en utilisant des connaissances spécifiques de l'application. Avant de générer une présentation personnalisée, tenez compte des points suivants :

A moins que vous ne soyez en train d'écrire une présentation très générique qui sera utilisée par plusieurs widgets composite, il est souvent plus simple et plus facile de calculer les dimensions et de placer les enfants dans un écouteur de redimensionnement. Un grand nombre des widgets personnalisés de SWT sont écrits de la sorte. Bien qu'un nouveau widget puisse être implémenté en tant que paire Composite/Présentation, son implémentation en tant que composite réalisant sa présentation dans un écouteur de redimensionnement et calculant sa dimension préférée dans computeSize est plus simple et n'implique pas l'écriture d'une classe supplémentaire.

Si vous croyez cependant avoir toujours besoin d'une classe de présentation personnalisée, il est préférable de commencer par implémenter l'algorithme de présentation dans un écouteur de redimensionnement. Ceci permet un débogage plus simple de l'algorithme lui-même. Veillez à tester les divers cas de présentation : redimensionnement plus petit, plus grand, retour à la ligne et troncature. Dès lors que l'algorithme fonctionne, le code peut être repensé en une sous-classe de présentation

Les présentations sont responsables de l'implémentation de deux méthodes :

Des informations supplémentaires sur les présentations personnalisées figurent à l'article Understanding Layouts in SWT.