
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.
- Qu'est-ce qu'un TreeTableView ?
- Comment ajouter des valeurs dans un TreeTableView ?
- Comment ajouter des colonnes dans un TreeTableView ?
- Comment faire des sous-colonnes ?
- Dans quelle colonne s'affiche l'arbre ?
- Qu'est-ce qu'une fabrique � valeurs ?
- Comment changer l'apparence des objets contenus dans un TreeTableView ?
Un TreeTableView<S> (litt�ralement, une vue sur un arbre-table) est un contr�le virtualis� qui fonctionne � la fois comme les contr�les TableView (la table) et TreeView (l'arbre) : il s'agit d'une table qui stocke ses donn�es de type S non plus dans une liste, mais dans une arborescence. Graphiquement, la table affiche un arbre dans sa premi�re colonne et il est possible de cacher ou d'afficher des lignes de la table en d�pliant des branches de l'arbre.
Ainsi, la plupart des astuces de la FAQ concernant le contr�le TreeView et applicables � la manipulation des instances de la classe TreeItem peuvent directement �tre utilis�es ici.
Pour ajouter des valeurs dans un TreeTableView, il faut les placer dans des instances de la classe javafx.scene.control.TreeItem<S> de mani�re � former une arborescence. La racine de cette arborescence doit �tre ensuite plac�e dans la propri�t� root de l'arbre-table.
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); treeTableView.setRoot(treeRoot); |
Ce qui nous donne :

-
Comment ajouter des valeurs dans un TreeView ? dans la FAQ concernant TreeView.
Initialement un TreeTableView ne contient aucune colonne. Pour ajouter des colonnes dans un arbre-table, il faut cr�er des objets de type javafx.scene.control.TreeTableColumn<S, T> et les ajouter dans la liste observable columns de l'arbre-table.
Ici :
- S est le type des objets contenus dans l'instance de TreeTableView ;
- T est le type des objets qui seront affich�s ou �dit�s dans la colonne.
Par exemple :
Code Java : | S�lectionner tout |
1 2 | final TreeTableColumn<Car, String> modelColumn = new TreeTableColumn<>("Mod�le"); treeTableView.getColumns().setAll(modelColumn); |
Ici, nous avons ajout� dans l'arbre-table graphique une colonne nomm�e � Mod�le � qui pour chaque objet de type Car pr�sent dans la table affichera un objet de type String (le mod�le de la voiture).
Nous pouvons �galement ajouter quelques colonnes suppl�mentaires en suivant le m�me principe :
Code Java : | S�lectionner tout |
1 2 3 4 5 | final TreeTableColumn<Car, String> brandColumn = new TreeTableColumn<>("Marque"); final TreeTableColumn<Car, Color> colorColumn = new TreeTableColumn<>("Couleur"); final TreeTableColumn<Car, Integer> seatsColumn = new TreeTableColumn<>("Si�ges"); final TreeTableColumn<Car, Integer> doorsColumn = new TreeTableColumn<>("Portes"); tableView.getColumns().addAll(brandColumn, colorColumn, seatsColumn, doorsColumn); |
ce qui nous donne :

Pour retirer des colonnes, il suffit de les retirer la liste observable columns de l'arbre-table.
-
Comment ajouter des colonnes dans une TableView ? dans la FAQ concernant TableView.
Pour faire des sous-colonnes, il suffit d'ajouter des colonnes dans la liste observable columns d'une autre colonne.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 | final TreeTableColumn<Car, String> modelColumn = new TreeTableColumn<>("Mod�le"); final TreeTableColumn<Car, String> brandColumn = new TreeTableColumn<>("Marque"); final TreeTableColumn<Car, Color> colorColumn = new TreeTableColumn<>("Couleur"); final TreeTableColumn<Car, Integer> seatsColumn = new TreeTableColumn<>("Si�ges"); final TreeTableColumn<Car, Integer> doorsColumn = new TreeTableColumn<>("Portes"); final TreeTableColumn<Car, ?> optionsColumn = new TreeTableColumn<>("Options"); optionsColumn.getColumns().setAll(colorColumn, seatsColumn, doorsColumn); treeTableView.getColumns().setAll(modelColumn, brandColumn, optionsColumn); |
Ce qui nous donne :

Ici, les colonnes � Couleur �, � Si�ges � et � Portes � sont incluses dans la colonne � Options �.
Pour retirer des colonnes, il suffit de les retirer la liste observable columns de la colonne m�re.
-
Comment faire des sous-colonnes ? dans la FAQ concernant TableView.
Par d�faut, dans un TreeTableView, l'arbre s'affiche toujours dans la premi�re colonne de la table. Cela reste le cas m�me si vous modifiez l'ordre des colonnes via l'API ou � la souris : la colonne en premi�re position est toujours celle dans laquelle s'affiche l'arbre, quelle que soit cette colonne.
Par exemple :
Code Java : | S�lectionner tout |
treeTableView.getColumns().setAll(nameColumn, photoColumn, priceColumn);
Ce qui nous donne :

Ici, par d�faut c'est la colonne nameColumn qui affiche l'arbre.
Si on d�place la colonne photoColumn en premi�re position avec la souris, c'est elle qui affichera l'arbre d�sormais.

Il est cependant possible de sp�cifier la valeur de la propri�t� treeColumnde l'arbre-table en lui donnant une r�f�rence vers une colonne du TreeTableView. Dans ce cas, l'arbre sera affich� dans cette colonne, m�me si la colonne n'est pas en premi�re position. De plus, si vous d�placez la colonne � une autre position, celle-ci continuera d'afficher l'arbre o� qu'elle se trouve.
Par exemple :
Code Java : | S�lectionner tout |
treeTableView.setTreeColumn(priceColumn);
Ce qui nous donne :

D�sormais c'est la troisi�me colonne, la colonne priceColumn, qui affiche l'arbre.
Si on d�place la colonne priceColumn avec la souris, elle continue � afficher l'arbre :

Tout comme les colonnes d'une TableView, les colonnes d'un TreeTableView n�cessitent d'utiliser une fabrique � valeurs (value cell factory en anglais) de mani�re � ce qu'une colonne de type <S, T> puisse afficher, et �diter, des objets de type T � partir d'objets de type S contenus dans l'arbre-table.
Il y a deux diff�rences dont il faut tenir compte quand on cr�e une fabrique � valeurs pour les colonnes d'un TreeTableView:
- les colonnes d'un arbre-table sont de type TreeTableColumn<S, T> alors que celles d'une table sont de type TableColumn<S, T> ;
- l'arbre-table contient des donn�es de type TreeItem<S> tandis que la table contient directement des valeurs de type S.
Pour le reste, deux contr�les fonctionnent grosso modo de mani�re similaire et donc vous pouvez vous inspirer de ce qui est �crit dans la FAQ pour les TableView.
Ce qui nous donne, par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 | modelColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Car, String>, ObservableValue<String>>() { @Override public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<Car, String> param) { final TreeItem<Car> item = param.getValue(); final Car car = item.getValue(); return new SimpleStringProperty(car.getModel()); } }); |
Ou :
Code Java : | S�lectionner tout |
1 2 3 4 5 | modelColumn.setCellValueFactory(param -> { final TreeItem<Car> item = param.getValue(); final Car car = item.getValue(); return new SimpleStringProperty(car.getModel()); }); |
Ici, nous avons cr�� une fabrique � valeur qui permettra d'afficher le mod�le de la voiture dans la colonne modelColumn.
-
Qu'est-ce qu'une fabrique � valeurs ? dans la FAQ concernant TableView.
Pour changer l'apparence des objets contenus dans un TreeTreeView, nous avons besoin de faire appel � l'API Cell. En effet, l'affichage par d�faut n'est pas tr�s engageant :
Reprenons au d�but. Tout d'abord, nous avons dans notre arbre-table des instances de la classe TreeItem<Entity> qui vont nous permettre de stocker nos groupes ainsi que les diverses marchandises qui les composent :
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 | private abstract static class Entity { String name; } private final static class Group extends Entity { public Group(final String name) { this.name = name; } } private static class Good extends Entity { Image photo; double price; public Good(final String name, final Image photo, double price) { this.name = name; this.photo = photo; this.price = price; } } |
Puis, nous nous sommes arrang�s pour extraire les bonnes valeurs sur les bonnes colonnes :
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 | final TreeTableColumn<Entity, String> nameColumn = new TreeTableColumn("Nom"); nameColumn.setCellValueFactory(param -> { final TreeItem<Entity> item = param.getValue(); final Entity data = item.getValue(); return new SimpleStringProperty(data.name); }); // final TreeTableColumn<Entity, Image> photoColumn = new TreeTableColumn("Photo"); photoColumn.setCellValueFactory(param -> { final TreeItem<Entity> item = param.getValue(); final Entity data = item.getValue(); return (data instanceof Good) ? new SimpleObjectProperty<>(((Good) data).photo) : null; }); // final TreeTableColumn<Entity, Double> priceColumn = new TreeTableColumn("Prix au kilo"); priceColumn.setCellValueFactory(param -> { final TreeItem<Entity> item = param.getValue(); final Entity data = item.getValue(); return (data instanceof Good) ? new SimpleObjectProperty<>(((Good) data).price) : null; }); // treeTableView.getColumns().setAll(nameColumn, photoColumn, priceColumn); |
Nous allons donc maintenant coder quelques cellules pour l'image servant d�aper�u de nos fruits et l�gumes. �tant donn� que le principe est similaire � ce que nous avons d�j� vu sur TableView et TreeView, je ne vais pas m��tendre trop longtemps sur le sujet :
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 | photoColumn.setCellFactory(column -> new TreeTableCell<Entity, Image>(){ private final ImageView imageView1 = new ImageView(); private final ImageView imageView2 = new ImageView(); private final Tooltip tooltip = new Tooltip(); { imageView1.setFitHeight(25); imageView1.setPreserveRatio(true); imageView1.setSmooth(true); tooltip.setText(null); tooltip.setGraphic(imageView2); } @Override protected void updateItem(Image item, boolean empty) { super.updateItem(item, empty); setGraphic(null); setText(null); setTooltip(null); if (!empty && item != null) { imageView1.setImage(item); imageView2.setImage(item); setGraphic(imageView1); setTooltip(tooltip); } } }); |
Ensuite, nous faisons de m�me pour le prix :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | priceColumn.setCellFactory(column -> new TreeTableCell<Entity, Double>(){ @Override protected void updateItem(Double item, boolean empty) { super.updateItem(item, empty); setText(null); if (!empty && item != null) { final String text = String.format("%.2f �", item.doubleValue()); setText(text); } } }); |
Ici, la cellule �tend TreeTableCell<Entity, Image> pour l�aper�u et TreeTableCell<Entity, Double> pour le prix.
Ce qui nous donne :

Les images des fruits et l�gumes affich�es ici proviennent directement de leur article respectif sur Wikip�dia.
Ici, d�sormais, nous affichons une image montrant notre produit et nous formatons correctement le prix pour notre utilisateur.
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.