
FAQ JavaFXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 507, derni�re mise � jour : 2 novembre 2016 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum JavaFX de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
Pour ajouter des valeurs dans une ComboBox, il suffit de les ajouter dans sa liste observable items.
Par exemple :
Code Java : | S�lectionner tout |
1 2 | final ComboBox<Car> comboBox = new ComboBox(); comboBox.getItems().setAll(car1, car2, car3, car4); |
Il est possible de retirer des valeurs de la boite d�roulante en les retirant de la liste observable items.
Pour savoir quand une valeur est s�lectionn�e dans une ComboBox, il suffit de placer un �couteur de type InvalidationListener ou ChangeListener sur la propri�t� value de la boite d�roulante.
Par exemple :
Code Java : | S�lectionner tout |
comboBox.valueProperty().addListener(observable -> System.out.printf("Valeur s�lectionn�e: %s", comboBox.getValue()).println());
Une seconde mani�re de faire consiste � r�cup�rer le mod�le de s�lection de la boite d�roulante en invoquant sa m�thode getSelectionModel() et en �coutant les changements de valeur de sa propri�t� selectedIndex ou selectedItem avec �couteur de type InvalidationListener ou un ChangeListener.
Par exemple :
Code Java : | S�lectionner tout |
1 2 | comboBox.getSelectionModel().selectedIndexProperty().addListener(observable -> System.out.printf("Indice s�lectionn�: %d", comboBox.getSelectionModel().getSelectedIndex()).println()); comboBox.getSelectionModel().selectedItemProperty().addListener(observable -> System.out.printf("Valeur s�lectionn�e: %d", comboBox.getSelectionModel().getSelectedItem()).println()); |
Pour s�lectionner une valeur dans une ComboBox, il est possible de modifier directement la valeur de sa propri�t� value.
Par exemple :
Code Java : | S�lectionner tout |
comboBox.setValue(car5);
Note : si la nouvelle valeur n'est pas d�j� pr�sente dans la boite d�roulante, elle sera bien s�lectionn�e, mais ne sera pas ajout�e � la liste observable items.
Une seconde mani�re de faire consiste � r�cup�rer le mod�le de s�lection de la boite d�roulante en invoquant sa m�thode getSelectionModel(). On peut ensuite invoquer une des variantes de la m�thode select() pour s�lectionner un indice ou une valeur donn�e.
Par exemple :
Code Java : | S�lectionner tout |
comboBox.getSelectionModel().select(car1);
Pour changer l'apparence des objets contenus dans une ComboBox, nous avons besoin de faire appel � l'API Cell. En effet l'affichage par d�faut n'est pas tr�s engageant :
Une boite d�roulante est constitu�e de trois parties :
- une partie bouton qui est la partie int�gr�e dans notre UI. Ce bouton peut contenir un �diteur lorsque la boite d�roulante est �ditable ;
- la partie contenant la fl�che dirig�e vers le bas situ�e � c�t� du bouton ;
- une liste qui s'affiche dans un popup.
Une ComboBox a donc besoin de deux types de cellules diff�rentes :
- une cellule sera utilis�e pour la partie bouton. G�n�ralement cette cellule contiendra uniquement du texte simple avec des graphismes r�duits compte tenu de l'espace limit� � l��cran ;
- une cellule sera utilis�e pour la partie liste. Cet affichage peut �tre plus riche, car nous avons plus de place � l��cran puisque la liste s'affiche dans un popup.
Les deux cellules peuvent avoir exactement le m�me affichage ou au contraire avoir une mise en page totalement diff�rente selon vos besoins.
Commen�ons par coder l'affichage simple qui sera utilis� par le bouton :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | public class SimpleCarListCell extends ListCell<Car> { @Override protected void updateItem(Car item, boolean empty) { super.updateItem(item, empty); setText(null); if (!empty && item != null) { final String text = String.format("%s %s", item.getBrand(), item.getModel()); setText(text); } } } |
Pour mettre en place cet affichage, il nous faut maintenant modifier la valeur de la propri�t� buttonCell de la boite d�roulante :
Code Java : | S�lectionner tout |
comboBox.setButtonCell(new SimpleCarListCell());
Ce qui nous donne :

Il nous faut maintenant fournir une fabrique � cellules pour les cellules qui seront utilis�es dans la partie popup. Pour le moment, contentons-nous de r�utiliser exactement la m�me cellule :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | comboBox.setCellFactory(new Callback<ListView<Car>, ListCell<Car>>() { @Override public ListCell<Car> call(ListView<Car> listView) { return new SimpleCarListCell(); } }); |
Ou :
Code Java : | S�lectionner tout |
comboBox.setCellFactory(listView -> new SimpleCarListCell());
Ce qui nous donne :

Ici, le contenu du menu popup de la boite d�roulante arbore d�sormais le m�me style d'affichage que celui de la zone bouton.
Cependant, cet affichage reste trop simpliste. Nous allons donc basculer l'affichage de la partie d�roulante vers un affichage riche qui va nous donner plus d'informations concernant notre v�hicule :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | public class RichCarListCell extends ListCell<Car> { private final GridPane gridPane = new GridPane(); private final ImageView brandIcon = new ImageView(); private final Label brandLabel = new Label(); private final Label modelLabel = new Label(); private final Rectangle colorRect = new Rectangle(10, 10); private final Label descriptionLabel = new Label(); private final ImageView carIcon = new ImageView(); private final AnchorPane content = new AnchorPane(); public RichCarListCell() { carIcon.setFitWidth(75); carIcon.setPreserveRatio(true); GridPane.setConstraints(carIcon, 0, 0, 1, 3); GridPane.setValignment(carIcon, VPos.TOP); // modelLabel.setStyle("-fx-font-weight: bold; -fx-font-size: 1.5em;"); GridPane.setConstraints(modelLabel, 1, 0); // brandLabel.setStyle("-fx-font-size: 0.9em; -fx-font-style: italic; -fx-opacity: 0.5;"); GridPane.setConstraints(brandLabel, 2, 0); // brandIcon.setFitWidth(22); brandIcon.setPreserveRatio(true); GridPane.setConstraints(brandIcon, 3, 0); GridPane.setValignment(brandIcon, VPos.CENTER); // colorRect.setStroke(Color.BLACK); descriptionLabel.setStyle("-fx-opacity: 0.75;"); descriptionLabel.setGraphic(colorRect); GridPane.setConstraints(descriptionLabel, 1, 1); GridPane.setColumnSpan(descriptionLabel, Integer.MAX_VALUE); // gridPane.getColumnConstraints().add(new ColumnConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, HPos.LEFT, true)); gridPane.getColumnConstraints().add(new ColumnConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.ALWAYS, HPos.LEFT, true)); gridPane.getColumnConstraints().add(new ColumnConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, HPos.LEFT, true)); gridPane.getColumnConstraints().add(new ColumnConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, HPos.LEFT, true)); gridPane.getRowConstraints().add(new RowConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, VPos.CENTER, true)); gridPane.getRowConstraints().add(new RowConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, VPos.CENTER, true)); gridPane.getRowConstraints().add(new RowConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.ALWAYS, VPos.CENTER, true)); gridPane.setHgap(6); gridPane.setVgap(6); gridPane.getChildren().setAll(carIcon, modelLabel, brandLabel, brandIcon, descriptionLabel); AnchorPane.setTopAnchor(gridPane, 0d); AnchorPane.setLeftAnchor(gridPane, 0d); AnchorPane.setBottomAnchor(gridPane, 0d); AnchorPane.setRightAnchor(gridPane, 0d); content.getChildren().add(gridPane); } @Override protected void updateItem(Car item, boolean empty) { super.updateItem(item, empty); setGraphic(null); setText(null); setContentDisplay(ContentDisplay.LEFT); if (!empty && item != null) { brandLabel.setText(item.getBrand()); modelLabel.setText(item.getModel()); brandIcon.setImage(item.getBrandImage()); carIcon.setImage(item.getCarImage()); descriptionLabel.setText(String.format(", %d places, %d portes", item.getSeats(), item.getDoors())); colorRect.setFill(item.getColor()); setText(null); setGraphic(content); setContentDisplay(ContentDisplay.GRAPHIC_ONLY); } } } |
Et rempla�ons la fabrique � cellules de notre boite d�roulante :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | comboBox.setCellFactory(new Callback<ListView<Car>, ListCell<Car>>() { @Override public ListCell<Car> call(ListView<Car> listView) { return new RichCarListCell(); } }); |
Ou :
Code Java : | S�lectionner tout |
comboBox.setCellFactory(listView -> new RichCarListCell());
Ce qui nous donne :

Note : les photos et logos affich�s ici sont directement li�s depuis les articles Wikip�dia des v�hicules et compagnies mentionn�es.
Ici, nous avons d�sormais un affichage bien plus complexe pour chaque entr�e de notre liste de voitures dans la boite d�roulante.
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.