Académique Documents
Professionnel Documents
Culture Documents
JavaFX
8 - Menus
Choix / Slection
Jacques BAPST
jacques.bapst@hefr.ch
Menus droulants
Menus contextuels
Mnmoniques / Acclrateurs
IHM-1 FX08
Jacques BAPST
Menu [1]
Les menus sont des lments de l'interface permettant l'utilisateur
de choisir des options qui pourront dclencher des actions et/ou
changer l'tat de certaines proprits de l'application.
Le principe du menu est (comme au restaurant) que l'utilisateur
puisse voir et parcourir la liste des options avant de se dcider.
Dans les applications, les menus peuvent prendre diffrentes
formes. Parmi les plus classiques, on trouve :
Les menu droulants (drop-down menu)
Des en-ttes de menus sont placs dans un conteneur sous forme de barre
Un clic sur ces en-ttes "droule" le menu et fait apparatre, dans une
fentre popup, les options de ce menu.
IHM-1 FX08
Jacques BAPST
Menu [2]
Les options des menus peuvent elles-mmes ouvrir d'autres menus.
On parle alors de sous-menus qui peuvent s'ouvrir en cascade (on
peut avoir plusieurs niveaux de sous-menus).
Dans la librairie JavaFX, un certain nombre de composants sont
ddis aux menus et sont utiliss pour les construire :
MenuBar
Menu
MenuItem
CheckMenuItem
RadioMenuItem
CustomMenuItem
SeparatorMenuItem
Contextmenu
IHM-1 FX08
Jacques BAPST
Menu [3]
Les diffrents composants qui interviennent dans la gestion des
menus droulants sont illustrs dans l'exemple suivant :
Menu
MenuBar
CheckMenuItem
SeparatorMenuItem
Menu
MenuItem
RadioMenuItem
IHM-1 FX08
Jacques BAPST
Menu [4]
Pour les menus contextuels, ce sont pratiquement les mmes
composants qui sont utiliss la simple diffrence que :
Le composant MenuBar n'est plus ncessaire.
A la place, c'est le composant ContextMenu qui est utilis pour
rassembler les diffrentes options du menu contextuel.
IHM-1 FX08
Jacques BAPST
L'ajout des menus (composants de type Menu) dans la barre peut se faire
de manire individuelle (en squence) ou collective :
mBar.getMenus().add(mnuFile);
mBar.getMenus().addAll(mnuFile, mnuOptions, mnuHelp);
Jacques BAPST
Jacques BAPST
IHM-1 FX08
Jacques BAPST
mniSave
= new MenuItem("Save");
ImageView
image
MenuItem
mniPrefs
Jacques BAPST
10
IHM-1 FX08
Jacques BAPST
11
cmiSound
= new CheckMenuItem("Sound");
ImageView
image
CheckMenuItem
IHM-1 FX08
Jacques BAPST
12
IHM-1 FX08
Jacques BAPST
13
rmiDock
= new RadioMenuItem("Docking");
ImageView
image
RadioMenuItem
IHM-1 FX08
Jacques BAPST
14
IHM-1 FX08
Jacques BAPST
15
Jacques BAPST
16
Pour chaque sparateur, il faut crer un nouvel objet (on ne peut pas
ajouter plusieurs fois un mme sparateur).
private SeparatorMenuItem sep1
= new SeparatorMenuItem();
private SeparatorMenuItem sep1
= new SeparatorMenuItem();
mnuPrefs.getItems().addAll(mniFont, mniSize, sep1,
rmiDock, rmiFloat, sep2,
. . .
);
IHM-1 FX08
Jacques BAPST
17
= new ContextMenu();
Jacques BAPST
18
Jacques BAPST
19
Raccourcis clavier
Il est souvent souhaitable que certaines actions que l'on peut
dclencher avec la souris puissent tre galement dclenches
l'aide du clavier.
C'est le rle des raccourcis clavier qui existent sous deux formes
principales :
Les mnmoniques
Activation du composant en pressant sur une touche spcifique qui dpend
de la plateforme (touche Alt sur Windows) associe un autre caractre
(gnralement alphanumrique).
Les mnmoniques sont associs des composants qui possde un libell et
le caractre associ au mnmonique est gnralement soulign.
Les acclrateurs
IHM-1 FX08
Jacques BAPST
20
Mnmonique
Des mnmoniques peuvent tre associs tous les composants
possdant un libell (sous-classes de Labeled) ainsi qu'aux menus et
aux diffrentes options de menus.
Pour ces composants, la proprit boolenne mnemonicParsing
indique si le caractre soulign '_' dans le libell du composant
doit tre considr comme l'annonce d'un mnmonique pour le
caractre suivant.
Menu
mnuFile
Menu
Button btnOk
= new Menu("_File");
= new Button("O_K");
IHM-1 FX08
Jacques BAPST
21
Acclrateur [1]
Des acclrateurs peuvent tre associs tous les composants de
type Menu (c'est rarement utile) et aux diffrentes options de menus
MenuItem, CheckMenuItem,
Pour ces composants, la proprit accelerator, qui est de type
KeyCombination indique la combinaison de touches qui permet de
dclencher l'action associe.
Il existe diffrentes manires de crer des objets de type
KeyCombination. Une des plus simples est d'utiliser la mthode
statique keyCombination("key-pattern") qui prend en paramtre
une chane de caractres qui sera interprte.
Cette chane de caractres comprendra un ou plusieurs modificateurs
et un caractre spars par le symbole plus '+'
Modificateurs possibles : Shift, Ctrl, Alt, Meta, Shortcut
Exemples : "Shift+A", "Ctrl+S", "Alt+Ctrl+M"
IHM-1 FX08
Jacques BAPST
22
Acclrateur [2]
Pour les touches spciales (Enter, Home, Page_Up, ), la classe
KeyCode dfinit des constantes numres reprsentant les
diffrentes touches du clavier. Le nom de ces constantes peut
gnralement tre utilis dans la chane de caractres passe la
mthode keyCombination().
La classe KeyCodeCombination peut
galement tre utilise pour crer des
combinaisons de touches (voir exemple).
Exemples de cration d'acclrateurs
sur des options de menu :
mniSave.setAccelerator(KeyCombination.keyCombination("Ctrl+S"));
mniAbout.setAccelerator(KeyCombination.keyCombination("Shift+Ctrl+A"));
mniQuit.setAccelerator(KeyCombination.keyCombination("Ctrl+Home"));
mnuOpt.setAccelerator(KeyCombination.keyCombination("Alt+Shift+Ctrl+O"));
mniSize.setAccelerator(new KeyCodeCombination(
KeyCode.S, KeyCombination.ALT_DOWN, KeyCombination.SHIFT_DOWN));
IHM-1 FX08
Jacques BAPST
23
MenuButton / SplitMenuButton
ChoiceBox / ComboBox
ListView / Spinner
IHM-1 FX08
Jacques BAPST
24
MenuButton
Le composant MenuButton est un bouton qui affiche un menu popup
lorsqu'il est cliqu ( la manire d'un menu contextuel).
C'est une sous-classe de ButtonBase
et son API est trs proche de celle du
composant Menu.
La proprit popupSide permet de
dfinir de quel ct doit s'ouvrir le
menu popup.
Exemple (extrait du code) :
MenuButton mbnOptions = new MenuButton("Options");
mnuSubOpt.getItems().addAll(mniSkin, mniSize, mniColor); // Sous-menu
mbnOptions.setPopupSide(Side.LEFT);
bnOptions.getItems().addAll(mniSave, mniQuit, mnuSubOpt, mniFont);
IHM-1 FX08
Jacques BAPST
25
SplitMenuButton
Le composant SplitMenuButton est une sorte de combinaison du
composant Button et du composant
MenuButton (dont il est une sous-classe).
La zone du bouton est divise en 2 parties :
Une zone avec un libell qui agit comme un
bouton ordinaire en dclenchant une action
lorsqu'on clique sur cette partie (code
associ la mthode setOnAction()).
Une zone de menu qui peut tre active en
cliquant dessus ou en utilisant les touches
"curseurs" du clavier et qui fonctionne
comme le composant MenuButton en
ouvrant un menu dans une fentre popup.
Jacques BAPST
26
ChoiceBox [1]
Le composant ChoiceBox permet de prsenter l'utilisateur une
liste d'lments dans laquelle il peut en slectionner un.
Le composant se prsente au dpart sous la forme d'un bouton et,
lorsqu'on clique dessus, les lments sont affichs sous la forme
d'une liste droulante.
L'lment actuellement slectionn est affich en libell lorsque la
liste est ferme (enroule).
Ce composant est rserver pour la slection de listes relativement
courtes car il n'y a pas de scrolling possible.
Par dfaut, il n'y a pas d'lment slectionn au dpart.
Le type du composant est gnrique ChoiceBox<T>, T tant le type
des lments de la liste.
IHM-1 FX08
Jacques BAPST
27
ChoiceBox [2]
Quelques proprits du composant ChoiceBox :
Liste des lments afficher. Un objet de type
ObservableList<T> que l'on peut galement passer au
items
constructeur. La liste des lments peut tre modifie
dynamiquement (ajout, suppression, ).
Modle de slection des lments de la liste.
Type SingleSelectionModel<T>.
selectionModel
On ne change gnralement pas le modle de slection par
dfaut.
value
Valeur de l'lment slectionn. Type <T>.
showing
Boolen qui indique si la liste des lments est affiche ou non.
Convertisseur qui indique comment l'lment est reprsent.
Ce convertisseur (StringConverter<T>) est utilis pour convertir
converter
les lments de type T en String (et inversement). Par dfaut,
c'est la mthode toString() de l'lment qui est utilise.
IHM-1 FX08
Jacques BAPST
28
ChoiceBox [3]
Exemple avec une liste de chanes de caractres (choix d'une langue).
ChoiceBox<String> cbxLang = new ChoiceBox<String>();
cbxLang.getItems().addAll("Deutsch", "English", "Franais", "Italiano");
cbxLang.getSelectionModel().select(1); // ou cbxLang.setValue("English");
root.getChildren().add(cbxLang);
IHM-1 FX08
Jacques BAPST
29
ChoiceBox [4]
Si l'on souhaite effectuer une action lors d'un changement de
slection, il faut enregistrer un gestionnaire d'vnement sur le
modle de slection (proprit selectedItem ou selectedIndex).
cbxLang.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov,
String s1, String s2)
{
System.out.println(s1+", "+s2); // Display old and new values
System.out.println(cbxLang.getSelectionModel().getSelectedIndex());
}
});
Jacques BAPST
30
ComboBox [1]
Le composant ComboBox<T> est assez similaire au composant
ChoiceBox et permet de prsenter l'utilisateur une liste d'lments
(de type T) dans laquelle il pourra en slectionner un.
Une des diffrences rside dans le fait que ComboBox permet de
limiter le nombre de choix affichs et offre automatiquement une
barre de dfilement (ascenseur) pour naviguer dans la liste.
Une autre diffrence est qu'un ComboBox peut tre ditable
(l'utilisateur peut saisir une valeur qui ne figure pas dans la liste).
ComboBox est une sous-classe de ComboBoxBase qui offre des
Jacques BAPST
31
ComboBox [2]
Quelques proprits du composant ComboBox :
Liste des lments afficher. Un objet de type
ObservableList<T> que l'on peut galement passer au
items
constructeur. La liste des lments peut tre modifie
dynamiquement (ajout, suppression, ).
Modle de slection des lments SingleSelectionModel<T>
selectionModel
(un seul lment peut tre slectionn).
value
Valeur de l'lment slectionn. Type <T>.
showing
Boolen qui indique si la liste des lments est affiche ou non.
Convertisseur qui indique comment l'lment est reprsent et,
s'il est ditable, comment traduire la chane de caractres en
converter
objet de type T.
Ce convertisseur (StringConverter<T>) est donc utilis pour
convertir les lments de type T en String et inversement.
Boolen qui indique si le ComboBox est ditable, c'est--dire que
editable
l'utilisateur peut saisir une valeur qui n'est pas dans la liste des
lments.
IHM-1 FX08
Jacques BAPST
32
ComboBox [3]
Nombre maximal de lignes affiches dans la liste droulante
visibleRowCount (Integer). Si ce nombre est dpass, une barre de dfilement
permet l'utilisateur de parcourir la liste (scrolling)
Traitement de l'vnement dclench lors du changement de la
onAction
valeur slectionne (value).
onShowing
onShown
onHiding
onHidden
promptText
placeholder
IHM-1 FX08
Jacques BAPST
33
ComboBox [4]
ComboBox<String> cbbCountry = new ComboBox<String>();
cbbCountry.getItems().addAll("Allemagne", "Angleterre", "Belgique",
"Espagne",
"France",
"Italie",
"Pays-Bas", "Portugal",
"Suisse");
cbbCountry.setPromptText("Select a Country...");
cbbCountry.setVisibleRowCount(5);
// Max 5 lments visibles
cbbCountry.setOnAction(event -> {
System.out.println(cbbCountry.getValue());
});
IHM-1 FX08
Jacques BAPST
34
ListView [1]
Le composant ListView<T> permet d'afficher un ensemble
d'lments (de type T) sous la forme d'une liste scrollable.
Les lments de la liste peuvent tre affichs verticalement (par
dfaut) ou horizontalement.
Jacques BAPST
35
ListView [2]
Le peuplement de la liste peut tre effectu en ajoutant les
lments avec les mthodes add() ou addAll() de la proprit
items (comme dans les exemples pour ChoiceBox et ComboBox).
Une autre manire de faire (courante) est d'utiliser des mthodes
statiques de la classe FXCollections pour crer des objets de type
ObservableList<T> qui seront assigns au composant ListView
avec la mthode setItems() ou alors passs en paramtre son
constructeur.
ListView<String> livCountry = new ListView<String>();
ObservableList<String> countries = FXCollections.observableArrayList(
"Allemagne", "Angleterre", "Belgique",
"Espagne",
"France",
"Italie",
"Pays-Bas", "Portugal",
"Suisse"
);
livCountry.setItems(countries);
IHM-1 FX08
Jacques BAPST
36
ListView [3]
Quelques proprits du composant ListView :
Liste des lments afficher dans la liste. Un objet de type
ObservableList<T> que l'on peut galement passer au
items
constructeur. La liste des lments peut tre modifie
dynamiquement (ajout, suppression, ).
Modle de slection des lments MultipleSelectionModel<T>.
selectionModel - Unique : setSelectionMode(SelectionMode.SINGLE)
- Multiple : setSelectionMode(SelectionMode.MULTIPLE)
orientation
Orientation de la liste. Type Orientation.
Boolen qui indique si la ListView est ditable. Cela implique que
editable
les lments (ListCell) doivent galement tre ditables ce qui
ncessite de redfinir la proprit cellFactory.
Composant (de type Node) afficher si la liste des lments est
placeholder
vide.
IHM-1 FX08
Jacques BAPST
37
ListView [4]
fixedCellSize
cellFactory
focusModel
onScrollTo
onEditStart
onEditCommit
onEditCancel
IHM-1 FX08
Jacques BAPST
38
ListView [5]
Mthodes pour grer la visibilit des lments de ListView :
Fait dfiler la liste (scroll), si ncessaire, pour que l'lment
correspondant l'indice pass en paramtre soit visible.
Fait dfiler la liste (scroll), si ncessaire, pour que l'lment
scrollTo(object)
correspondant l'objet pass en paramtre soit visible.
scrollTo(index)
ComboBoxListCell
Jacques BAPST
39
ListView [6]
Exemple d'utilisation d'un composant ListView pour permettre
l'utilisateur de slectionner des pays (slection multiple) et affichage
sur la console de la slection courante ( chaque changement).
ListView<String> livCountry = new ListView<String>();
ObservableList<String> countries = FXCollections.observableArrayList(
"Allemagne", "Angleterre", "Belgique",
"Espagne",
"France",
"Italie",
"Pays-Bas", "Portugal",
"Suisse"
);
livCountry.setItems(countries);
livCountry.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
livCountry.setFixedCellSize(22);
livCountry.setPrefSize(200, 180);
livCountry.setOnMouseClicked(event -> {
System.out.println(livCountry.getSelectionModel().getSelectedItems());
});
IHM-1 FX08
Jacques BAPST
40
ListView [7]
Excution de l'application :
IHM-1 FX08
Jacques BAPST
41
ListView [8]
Exemple d'utilisation d'un composant ListView en plaant une liste
droulante (ComboBox) comme lment ditable de la liste.
ObservableList<String> candidates = FXCollections.observableArrayList();
ObservableList<String> top10
= FXCollections.observableArrayList();
ListView<String> listView = new ListView<String>(top10);
listView.setPrefSize(180, 235);
listView.setEditable(true);
lments de la
ComboBox
// Valeurs initiales
ComboBox comme ListCell
listView.setItems(top10);
listView.setCellFactory(ComboBoxListCell.forListView(candidates));
IHM-1 FX08
Jacques BAPST
42
ListView [9]
L'utilisateur peut cliquer sur un des lments de la liste et faire
apparatre un composant qui s'apparente un ComboBox qui lui
permet de choisir dans la liste droulante.
La valeur slectionne dans la liste droulante devient la valeur de
l'lment de la ListView.
IHM-1 FX08
Jacques BAPST
43
Spinner [1]
Le composant Spinner<T> permet l'utilisateur de slectionner une
valeur dans une liste d'lments ordonns (de type T).
Seule la valeur de l'lment slectionn est affiche dans un champ
texte interne (TextField) nomm diteur (proprit Editor).
IntegerSpinnerValueFactory
DoubleSpinnerValueFactory
ListSpinnerValueFactory
Jacques BAPST
44
Spinner [2]
Le dfilement des valeurs peut tre rendu circulaire (wrapping).
L'emplacement des boutons de dfilement est configurable en
changeant le style CSS associ la classe du composant.
En plus du style par dfaut (right vertical), cinq styles sont dfinis par
des constantes de la classe Spinner.
Spinner<Integer>
Spinner<Double>
sprI
sprD
sprI.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_VERTICAL);
sprD.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL);
IHM-1 FX08
Jacques BAPST
45
Spinner [3]
Diffrents constructeurs permettent de crer le composant Spinner
en dfinissant simultanment le type et les valeurs enregistres dans
le modle interne.
Pour les modles numriques, les valeurs minimales, maximales,
initiales ainsi que les incrments (step) peuvent tre dfinis.
Exemples :
Spinner<Integer> sprTemp
Spinner<Double>
Spinner<String>
sprDays
= new Spinner<>(
FXCollections.observableArrayList(
"Monday",
"Tuesday",
Modle de type
"Wednesday",
ListSpinnerValueFactory
"Thursday",
"Friday",
"Saturday",
"Sunday"
));
IHM-1 FX08
Jacques BAPST
46