Utiliser des styles

Introduction

JAXX vous permet de séparer le contenu de l'apparance, un peu comme en HTML, en utilisant les feuilles de style CSS. Les feuilles de style JAXX peuvent assigner n'importe quelle propriété d'un objet, et permettre a n'importe quel nombre d'objets d'être décorés de la même manière avec des règles simples. De plus, les feuilles de style vous permettent de créer facilement des comportements dynamiques.

Appliquer un style

Pour qu'une application utilise une feuille de style, il lui suffit d'avoir une balise style à sa racine

<Application title='Example'>
  <style source='example.css'/>
  ...
</Application>

Les sélecteurs

Ensuite, la feuille de style en question ressemble à une feuille de style HTML. Le style d'une classe Java est définit de la manière suivante

JSlider {
  paintTicks: true;
  minorTickSpacing: 10;
  majorTickSpacing: 50;
}

Ainsi toutes les JSlider de l'application auront ce style. On peut également définir le style d'une balise ayant un id particulier de cette manière:

#red {
  background: red;
}

Ainsi, les balises qui ont un id red auront toute un background rouge.

Pour résumé, il y a 4 types de sélecteur de style.

Type

Syntaxe

Description

classe Java

classname

Sélectionne toutes les instances de la classe (ou ses sous-classes) spécifiée

ID

#id

Sélectionne les composants ayant l'attribut id='<id>'

Classe de style

.styleclass

Sélectionne les composants avec l'attribut styleClass='<styleClass>'

Pseudo-classe

:mouseover, :focused, ...

Sélectionne les composants dynamiquement selon leur état

Expressions Java

Beaucoup de style Swing ne peut être déclaré qu'en utilisant des expressions Java. Ces expressions Java peuvent être insérées dans des feuilles de style si elles sont échappées par des accolades. Par exemple:

JSlider {
  border: {BorderFactory.createLineBorder(Color.black, 1)};
}

Combiner les sélecteurs

Un sélecteur est une expression spécifique qui peux être vraie ou fausse pour n'importe quel type de composant. Vrai signifie que le composant est affecté par la règle, faux signifie qu'il ne l'est pas. Les quatres types de sélecteur basiques peuvent être combinés pour former des expressions composées:

  • JButton.cancel: S'applique à toutes les instances de JButton (ou une sous-classe) qui a styleClass='cancel'.
  • #display:disabled: S'applique au composant ayant l'ID display quand il est dans le statut disabled.
  • AbstractButton.large:selected: S'applique a toutes les sous-classes d'AbstractButton ayant styleClass='large' lorsqu'ils sont dans le statut selected.

Le style

Le support des css JAXX est relativement similaire au HTML. La grosse différence est qu'au lieu d'appliquer des propriétés spécifiques au HTML comme padding ou color, vous appliquez des propriétés spécifiques comme border ou foreground. Les mêmes propriétés que vous pouvez spécifier directement sur les tags. JAXX utilises aussi les pseudo-classe CSS, une fonctionnalité peu utilisée qui vous permet de changer le style des liens, et étendue pour fonctionner avec tous les composants permet de répondre à a peu près tous les évènements.

Les pseudo-classes

Il peut-être intéressant de changer le style d'un composant lorsqu'il est dans un état particulier. Dans ce cas, il suffit d'utiliser les pseudo-classes. Par exemple, si on souhaite que notre élément ayant l'ID red ne devienne rouge que lorsqu'il est survolé par la souris, il suffit de changer le style à:

#red:mouseover {
  background: #E7ADAD;
}

JAXX supporte les pseudo-classes suivantes:

  • mouseover
  • mouseout
  • mousedown
  • mouseup
  • enabled
  • disabled
  • focused
  • unfocused
  • selected
  • deselected
  • armed
  • unarmed

Pseudo-classes programmatiques

Chaque pseudo-classe est, comme tous les sélecteurs, un test vrai/faux. La souris survole le composant, ou pas ? En plus de toutes les pseudo-classes, JAXX vous permet de spécifier explicitement un test comme ceci:

JSlider#powerLevel:{object.getValue() > 100} {
  background: red;
}

Il apparait au même endroit qu'une pseudo-classe, sauf que c'est une expression Java échappée par des accolades. Avec ce style, le JSlider avec l'ID powerLevel deviendra rouge lorsque sa valeur dépassera 100. Cette sorte de pseudo-classe est appellée pseudo-classe programmatique, et elle vous donne toute la flexibilité possible pour décider si un style doit être appliqué à un objet.

Le système de data binding de JAXX est utilisé pour suivre les changements d'une expression, ainsi les pseudo-classes programmatique supportent les mêmes propriétés que le data-binding. En interne, la plupart des pseudo-classes JAXX sont implémentées comme des pseudo-classes programmatiques. Ainsi la pseudo-classe focused, par example, est exactement équivalente à {object.hasFocus()}, mais beaucoup plus simple à retenir.