
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.
- Comment ajouter des valeurs dans un TreeView ?
- Comment ajouter des sous-n�uds dans un TreeItem ?
- Comment d�plier une branche dans un TreeView ?
- Comment tester si un TreeItem est une feuille dans un TreeView ?
- Comment cacher la racine du TreeView ?
- Comment changer l'apparence des objets contenus dans un TreeView ?
Pour ajouter des valeurs dans un TreeView, il faut les placer dans des instances de la classe javafx.scene.control.TreeItem<T> de mani�re � former une arborescence. Ici, T est le type des donn�es affich�es dans l'arbre. La racine de cette arborescence doit �tre ensuite plac�e dans la propri�t� root de l'arbre graphique.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | final TreeItem<String> fruitItem = new TreeItem<>("Fruits"); fruitItem.getChildren().setAll( new TreeItem("Fraise"), new TreeItem("Pomme"), new TreeItem("Poire") ); fruitItem.setExpanded(true); final TreeItem<String> vegetableItem = new TreeItem<>("L�gumes"); vegetableItem.getChildren().setAll( new TreeItem("Artichaut"), new TreeItem("Laitue"), new TreeItem("Radis") ); vegetableItem.setExpanded(true); final TreeItem<String> treeRoot = new TreeItem<>("Fruits & l�gumes"); treeRoot.setExpanded(true); treeRoot.getChildren().setAll(fruitItem, vegetableItem); treeView.setRoot(treeRoot); |
Ce qui nous donne :

Pour ajouter des sous-n�uds dans un TreeItem, il faut cr�er un nouvel objet TreeItem pour chaque sous-n�ud et les ajouter dans sa liste observable chidlren.
Par exemple :
Code java : | S�lectionner tout |
item.getChildren().setAll(subItem1, subItem2, subItem3, subItem4);
Pour retirer des sous-n�uds d'un TreeItem, il suffit de les retirer de cette m�me liste observable children.
Pour d�plier une branche dans un TreeView, il suffit de r�cup�rer le TreeItem correspondant au n�ud de la branche et modifier la valeur de sa propri�t� expanded en lui donnant la valeur true.
Par exemple :
Code Java : | S�lectionner tout |
item.setExpanded(true);
Pour savoir si un TreeItem dans un TreeView est une feuille (il n'y a pas de sous-n�uds dans cette branche), il suffit d'interroger sa propri�t� en lecture seule leaf. Cette propri�t� retourne la valeur true quand le n�ud est une feuille.
Code Java : | S�lectionner tout |
1 2 | if (item.isLeaf()) { ... |
On peut aussi v�rifier la taille ou le contenu de la liste observable children du TreeItem.
Pour cacher la racine du TreeView, il faut modifier la valeur de sa propri�t� showRoot et lui donner la valeur false.
Par exemple :
Code Java : | S�lectionner tout |
treeView.setShowRoot(false);
Le n�ud racine de l'arbre ne sera alors pas affich�, mais ses sous-n�uds seront affich�s quant � eux.
Pour changer l'apparence des objets contenus dans un TreeView, nous avons besoin de faire appel � l'API Cell. En effet, l'affichage par d�faut n'est pas tr�s engageant :
Commen�ons par coder un affichage simple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class SimpleCarTreeCell extends TreeCell { @Override protected void updateItem(Object item, boolean empty) { super.updateItem(item, empty); setText(null); if (!empty && item != null) { if (item instanceof Car) { final Car car = (Car) item; final String text = String.format("%s %s", car.getBrand(), car.getModel()); setText(text); } else { setText(item.toString()); } } } } |
Ici, la cellule �tend TreeCell au lieu de TreeCell<Car>, car notre arbre contient des donn�es h�t�roclites de plusieurs types distincts : certains n�uds contiennent des chaines de caract�res tandis que d'autres contiennent des instances de la classe Car.
Nous devons ensuite sp�cifier la fabrique � cellules qui sera utilis�e dans l'arbre :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | treeView.setCellFactory(new Callback<TreeView, TreeCell>() { @Override public TreeCell call(TreeView tv) { return new SimpleCarTreeCell(); } }); |
Ou :
Code Java : | S�lectionner tout |
treeView.setCellFactory(tv -> new SimpleCarTreeCell());
Ce qui nous donne :

Ici, d�sormais, nous affichons le mod�le et la marque de la voiture.
Nous allons maintenant utiliser un affichage plus riche qui va afficher une photo du v�hicule, sa couleur, son nombre de si�ges et de portes, etc. :
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 71 72 73 74 75 76 77 | public class RichCarTreeCell extends TreeCell { 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 RichCarTreeCell() { 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); } // private Node fxmlContent; // private final RichCarListCellController fxmlController; @Override protected void updateItem(Object item, boolean empty) { super.updateItem(item, empty); setGraphic(null); setText(null); setContentDisplay(ContentDisplay.LEFT); if (!empty && item != null) { if (item instanceof Car) { final Car car = (Car) item; brandLabel.setText(car.getBrand()); modelLabel.setText(car.getModel()); brandIcon.setImage(car.getBrandImage()); carIcon.setImage(car.getCarImage()); descriptionLabel.setText(String.format(", %d places, %d portes", car.getSeats(), car.getDoors())); colorRect.setFill(car.getColor()); setText(null); setGraphic(content); setContentDisplay(ContentDisplay.GRAPHIC_ONLY); } else { setText(item.toString()); } } } } |
Et rempla�ons la fabrique � cellules de notre arbre :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | treeView.setCellFactory(new Callback<TreeView, TreeCell>() { @Override public TreeCell call(TreeView tv) { return new RichCarTreeCell(); } }); |
Ou :
Code Java : | S�lectionner tout |
treeView.setCellFactory(tv -> new RichCarTreeCell());
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.
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.