Accueil / Articles PiApplications. / La plate-forme Java / Java FX

Doter une en-tête de colonne d'une info-bulle.

Lorsque l'on parcours la documentation de la classe TableColumn, on ne trouve aucune méthode qui permette de doter son en-tête d'une info-bulle. La raison en est simple : ce n'est pas une classe dérivée de la classe Control.

La classe Tooltip dispose de la méthode statique install() qui permet d'affecter à n'importe quel objet dérivé de la classe Node une info-bulle. Cela ne fonctionne pas ici sans doute parce que le survol de la souris est capturé sans que l'évènement ne soit transmis à l'en-tête de colonne.

Une solution simple.

Pour parvenir à nos fins, nous devons nous rappeler qu'une interface graphique Java FX est une arborescence de "noeuds" (classe Node). Il est donc possible d'affecter à un objet de classe TableColumn un contrôle dérivé de la classe Control via la méthode setGraphics. C'est ensuite à ce contrôle que nous pourrons associer notre info-bulle. Voyons cela sur un exemple :

TableColumn<ContactRow, Image> tclStatus = new TableColumn<>();
// _tvwCntMaster est un contrôle de classe TableView
_tvwCntMaster.getColumns().add(tclStatus);  // TableView auquel on ajoute la colonne
tclStatus.setMinWidth(24);
tclStatus.setMaxWidth(24);
tclStatus.setPrefWidth(24);
Label lbl = new Label();
lbl.setMinWidth(24);
lbl.setMaxWidth(24);
lbl.setPrefWidth(24);
lbl.setMinHeight(24);
lbl.setMaxHeight(24);
lbl.setPrefHeight(24);
tclStatus.setGraphic(lbl);
lbl.setTooltip(new Tooltip("Contenu de l'info-bulle"));

Dans cet exemple, nous créons une colonne destinées à afficher des icônes 24 x 24. La largeur est trop faible pour y afficher un titre. C'est pour cette raison que nous devons fixer les dimensions du contrôle de classe Label. Sans cela, la surface offerte par ce contrôle serait trop faible pour que l'utilisateur puisse facilement y glisser la souris dessus pour afficher l'info-bulle.

Pour aller plus loin.

La difficulté pour installer une info-bulle dans un contrôle de classe TableView ne se limite pas aux en-têtes des colonnes. Si vous installez dans les cellules des objets qui ne dérivent pas de la classe Control comme par exemple un objet de classe ImageView vous rencontrerez la même difficulté.

Il existe toujours la possibilité de créer une classe comme TooltipedTableCell dérivant de la classe TableCell. Dans la classe dérivée (méthode updateItem), on affecte l'info-bulle.

Cette surcharge peut être évitée en utilisant la même technique que précédemment : placer un contrôle de classe Label(éventuellement sans texte ou avec une image) et en affectant à ce dernier l'info-bulle via la méthode setTooltipde cette classe.

(c) PiApplications 2015