IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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.

SommaireSceneGraphInterface utilisateurContr�lesContr�les virtualis�sTableView (12)
pr�c�dent sommaire suivant
 

Pour ajouter des valeurs dans une TableView, il suffit de les ajouter dans sa liste observable items.

Par exemple :

Code Java : S�lectionner tout
1
2
final TableView<Car> tableView = new TableView(); 
tableView .getItems().setAll(car1, car2, car3, car4);

Il est possible de retirer des valeurs de la table graphique en les retirant de sa liste observable items.

Note : oui, la table graphique n'est en fait qu'une liste de valeurs. Chaque colonne est en fait une vue qui affiche une donn�e issue, extraite ou transform�e � partir d'une des valeurs contenues dans la table.

Mis � jour le 29 septembre 2014 bouye

Pour savoir quand une valeur est s�lectionn�e dans une TableView, il faut r�cup�rer le mod�le de s�lection dans la table en invoquant sa m�thode getSelectionModel() et �couter 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
tableView.getSelectionModel().selectedIndexProperty().addListener(observable -> System.out.printf("Indice s�lectionn�: %d", tableView.getSelectionModel().getSelectedIndex()).println()); 
tableView.getSelectionModel().selectedItemProperty().addListener(observable -> System.out.printf("Valeur s�lectionn�e: %d", tableView.getSelectionModel().getSelectedItem()).println());

Mis � jour le 29 septembre 2014 bouye

Pour s�lectionner une valeur dans une TableView, il faut r�cup�rer le mod�le de s�lection de la table graphique 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
tableView.getSelectionModel().select(car1);

Cela s�lectionnera toutes les colonnes pr�sentes sur la ligne qui affiche cette valeur.

Mis � jour le 29 septembre 2014 bouye

Pour faire que les colonnes occupent tout l'espace horizontal de la TableView, il faut modifier la valeur de la propri�t� columnResizePolicy de la table graphique. Cette propri�t� accepte un callback qui permet d'effectuer la mise en page des colonnes. Cependant, de base, deux impl�mentations sont fournies pr�tes � l'emploi dans la classe TableView :

  • TableView.UNCONSTRAINED_RESIZE_POLICY - la valeur par d�faut : la mise en page des colonnes d�pend de leur largeur pr�f�r�e ;
  • TableView.CONSTRAINED_RESIZE_POLICY - les colonnes sont redimensionn�es pour occuper toute la largeur de la table.


Par exemple :

Code Java : S�lectionner tout
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

Mis � jour le 29 septembre 2014 bouye

Pour d�sactiver le tri automatique sur les colonnes qui se d�clenche lors que l'utilisateur clique sur l�ent�te d'une colonne avec la souris, il faut modifier la propri�t� sortable de cette colonne et lui donner une valeur false.

Par exemple :

Code Java : S�lectionner tout
colorColumn.setSortable(false);

Mis � jour le 29 septembre 2014 bouye

Initialement, une TableView ne contient aucune colonne. Pour ajouter des colonnes dans une table, il faut cr�er des objets de type javafx.scene.control.TableColumn<S, T> et les ajouter dans la liste observable columns de la table.

Ici :

  • S est le type des objets contenus dans l'instance de TableView ;
  • 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 TableColumn<Car, String> modelColumn = new TableColumn<>("Mod�le"); 
tableView.getColumns().setAll(modelColumn);

Ici, nous avons ajout� dans la 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 TableColumn<Car, String> brandColumn = new TableColumn<>("Marque"); 
final TableColumn<Car, Color> colorColumn = new TableColumn<>("Couleur"); 
final TableColumn<Car, Integer> seatsColumn = new TableColumn<>("Si�ges"); 
final TableColumn<Car, Integer> doorsColumn = new TableColumn<>("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 la table.

Mis � jour le 29 septembre 2014 bouye

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 TableColumn<Car, String> modelColumn = new TableColumn<>("Mod�le"); 
final TableColumn<Car, String> brandColumn = new TableColumn<>("Marque"); 
final TableColumn<Car, Color> colorColumn = new TableColumn<>("Couleur"); 
final TableColumn<Car, Integer> seatsColumn = new TableColumn<>("Si�ges"); 
final TableColumn<Car, Integer> doorsColumn = new TableColumn<>("Portes"); 
final TableColumn<Car, ?> optionsColumn = new TableColumn<>("Options"); 
optionsColumn.getColumns().setAll(colorColumn, seatsColumn, doorsColumn); 
tableView.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.

Mis � jour le 29 septembre 2014 bouye

Une fabrique � valeurs (value factory en anglais) est un callback plac� sur une colonne de type <S, T> et qui permet de retrouver une valeur de type T � partir d'un objet source de type S contenu dans la table.

Les objets de type TableColumn<S, T> disposent d'une propri�t� cellValueFactory qui permet de sp�cifier ce callback (� ne pas confondre avec la propri�t� cellFactory).

Par exemple :

  • si l'objet est accessible par une propri�t� JavaFX, c'est tr�s simple, nous pouvons cr�er une nouvelle instance de la classe javafx.scene.control.cell.PropertyValueFactory<S, T> qui se chargera pour nous d�acc�der � la propri�t� :
    Code Java : S�lectionner tout
    modelColumn.setCellValueFactory(new PropertyValueFactory<>("model"));

    Si la cellule est �ditable et que son contenu est modifi�, la propri�t� JavaFX de l'objet source sera directement mise � jour ;
  • si l'objet est accessible par une propri�t� Java Beans observable, nous pouvons l'empaqueter comme d'habitude gr�ce � un monteur pr�d�fini disponible dans le package javafx.beans.property.adapter :

    Code Java : S�lectionner tout
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    modelColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Car, String>, ObservableValue<String>>() { 
      
        @Override 
        public ObservableValue<String> call(TableColumn.CellDataFeatures<Car, String> param) { 
            final Car car = param.getValue();  
            try { 
                return JavaBeanStringPropertyBuilder.create().bean(car).name("model").build(); 
            } catch (NoSuchMethodException ex) { 
                Logger.getLogger(getClass().getName()).log(Level.SEVERE, ex.getMessage(), ex); 
                return null; 
            } 
        } 
    });

    Ou :

    Code Java : S�lectionner tout
    1
    2
    3
    4
    5
    6
    7
    8
    9
    modelColumn.setCellValueFactory(param  -> { 
        final Car car = param.getValue(); 
        try { 
            return JavaBeanStringPropertyBuilder.create().bean(car).name("model").build(); 
        } catch (NoSuchMethodException ex) { 
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, ex.getMessage(), ex); 
            return null; 
        } 
    });


    Si la cellule est �ditable et que son contenu est modifi�, la propri�t� Java Beans observable de l'objet source sera directement mise � jour ;
  • Si l'objet n'est pas accessible par une propri�t� JavaFX ou une propri�t� Java Beans observable, nous allons devoir instancier manuellement une valeur observable pour stocker l'objet retourn� :
    Code Java : S�lectionner tout
    1
    2
    3
    4
    5
    6
    7
    8
    modelColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Car, String>, ObservableValue<String>>() { 
      
        @Override 
        public ObservableValue<String> call(TableColumn.CellDataFeatures<Car, String> param) { 
            final Car car = param.getValue(); 
            return new SimpleStringProperty(car.getModel()); 
        } 
    });

    Ou :

    Code Java : S�lectionner tout
    1
    2
    3
    4
    modelColumn.setCellValueFactory(param  -> { 
        final Car car = param.getValue(); 
        return new SimpleStringProperty(car.getModel()); 
    });


    Ici, il n'y a aucune liaison entre la propri�t� retourn�e et l'objet source, donc en cas d��dition les modifications ne sont pas report�es sur l'objet source.


Nous pouvons donc d�sormais peupler correctement notre table :

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
final TableView<Car> tableView = new TableView();  
tableView .getItems().setAll(car1, car2, car3, car4, car5); 
final TableColumn<Car, String> modelColumn = new TableColumn<>("Mod�le"); 
modelColumn.setCellValueFactory(param -> { 
    final Car car = param.getValue(); 
    return new SimpleStringProperty(car.getModel()); 
}); 
final TableColumn<Car, String> brandColumn = new TableColumn<>("Marque"); 
brandColumn.setCellValueFactory(param -> { 
    final Car car = param.getValue(); 
    return new SimpleStringProperty(car.getBrand()); 
}); 
final TableColumn<Car, Color> colorColumn = new TableColumn<>("Couleur"); 
colorColumn.setCellValueFactory(param -> { 
    final Car car = param.getValue(); 
    return new SimpleObjectProperty<>(car.getColor()); 
}); 
final TableColumn<Car, Integer> seatsColumn = new TableColumn<>("Si�ges"); 
seatsColumn.setCellValueFactory(param -> { 
    final Car car = param.getValue(); 
    return new SimpleObjectProperty<>(car.getSeats()); 
}); 
final TableColumn<Car, Integer> doorsColumn = new TableColumn<>("Portes"); 
doorsColumn.setCellValueFactory(param -> { 
    final Car car = param.getValue(); 
    return new SimpleObjectProperty<>(car.getDoors()); 
}); 
final TableColumn<Car, ?> optionsColumn = new TableColumn<>("Options"); 
optionsColumn.getColumns().setAll(colorColumn, seatsColumn, doorsColumn); 
tableView.getColumns().setAll(modelColumn, brandColumn, optionsColumn); 
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

Ce qui nous donne :

Mis � jour le 29 septembre 2014 bouye

Ici, chaque colonne de la table dispose de sa propre propri�t� cellFactory qui permet de placer un callback permettant de g�n�rer des cellules pour chaque ligne de cette colonne.

Prenons, par exemple, la couleur de la carrosserie de notre voiture. Nous allons utiliser une cellule qui affiche un rectangle de couleur (en fait une Region) :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class CarColorTableCell extends TableCell<Car, Color> { 
  
    final Region region = new Region(); 
  
    @Override 
    protected void updateItem(Color item, boolean empty) { 
        super.updateItem(item, empty); 
        setGraphic(null);   
        setText(null);   
        if (!empty && item != null) { 
            region.setBackground(new Background(new BackgroundFill(item, CornerRadii.EMPTY, Insets.EMPTY))); 
            setGraphic(region);             
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
        } 
    }     
}

Et nous mettons cela en place sur la colonne en faisant :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
colorColumn.setCellFactory(new Callback<TableColumn<Car, Color>, TableCell<Car, Color>>() { 
  
    @Override 
    public TableCell<Car, Color> call(TableColumn<Car, Color> tc) { 
        return new CarColorTableCell(); 
    } 
});

Ou :

Code Java : S�lectionner tout
colorColumn.setCellFactory(tc -> new CarColorTableCell());

Ce qui nous donne :

Mis � jour le 29 septembre 2014 bouye

Il est possible d'activer l��dition sur une TableView en modifiant la valeur de sa propri�t� editable et en lui donnant la valeur true. De plus, chaque colonne dispose de sa propre propri�t� editable, ce qui permet d�activer ou de d�sactiver l��dition sur cette colonne.

Par exemple :

Code Java : S�lectionner tout
1
2
tableView.setEditable(true); 
ageColumn.setEditable(false);

Ici, bien que la table soit �ditable, la colonne � �ge � ne l'est pas.

Elle deviendra �ditable si nous faisons :

Code Java : S�lectionner tout
ageColumn.setEditable(true);

Cependant, les cellules utilis�es par d�faut dans l'affichage d'une TableView ne supportent pas le mode �dition et donc rien ne se passera si l'utilisateur clique sur une valeur dans la table graphique.

Pour ajouter des cellules supportant le mode �dition sur les colonnes, il est possible d'utiliser les cellules pr�tes � l'emploi disponibles dans le package javafx.scene.control.cell. Bien qu'il soit possible de les �tendre directement, ces classes disposent en g�n�ral de m�thodes de fabrique statiques pour en faciliter l'usage.

Par exemple, nous pouvons int�grer un �diteur dans la colonne affichant les pr�noms :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
lastNameNameColumn.setCellFactory(TextFieldTableCell.forTableColumn()); 
firstNameColumn.setCellFactory(TextFieldTableCell.forTableColumn()); 
ageColumn.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Integer>() { 
  
    @Override 
    public String toString(Integer object) { 
        return String.valueOf(object); 
    } 
  
    @Override 
    public Integer fromString(String string) { 
        return Integer.parseInt(string); 
    } 
}));

Ce qui nous donne :



Ici, par exemple, nous utilisons des �diteurs qui reposent sur des champs de saisie de texte. D�sormais, lorsque l'utilisateur clique sur une valeur dans la table dans une de ces colonnes, un �diteur sera positionn� � l'emplacement s�lectionn�. �tant donn� que la colonne � �ge � contient des entiers et non pas des chaines de texte, nous devons donc passer un convertisseur en param�tre de la fabrique. Ce convertisseur permettra de transformer la saisie de l'utilisateur en entier de mani�re � changer l'�ge et inversement.

Il est aussi possible de cr�er vos propres cellules �diteurs et de surcharger la m�thode commitEdit().

Mis � jour le 30 septembre 2014 bouye

Pour afficher des cases � cocher dans les colonnes contenant des valeurs bool�ennes, il faut utiliser des cellules pr�tes � l'emploi de type javafx.scene.control.cell.CheckBoxTableCell. Vous pouvez soit directement �tendre cette classe, soit utiliser une des m�thodes statiques de fabrique disponibles.

Par exemple :

Code Java : S�lectionner tout
booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(booleanColumn));

Note : si vous utilisez la fabrique statique, cette classe �tablit une liaison bidirectionnelle entre la propri�t� retourn�e par la fabrique � valeur et l��tat selected de la case � cocher.
  • si la valeur de la propri�t� change, l��tat selected de la case � cocher sera mis � jour en cons�quence ;
  • si la table est �ditable, s�lectionner ou d�s�lectionner la case mettra � jour la valeur de la propri�t�.


Mis � jour le 30 septembre 2014 bouye

Pour afficher des boites d�roulantes dans une TableView, il faut utiliser des cellules pr�tes � l'emploi de type javafx.scene.control.cell.ChoiceBoxTableCell ou de type javafx.scene.control.cell.ComboBoxTableCell. Vous pouvez soit directement �tendre ces classes, soit utiliser une des m�thodes statiques de fabrique disponibles.

Par exemple :

Code Java : S�lectionner tout
sexColumn.setCellFactory(ChoiceBoxTableCell.forTableColumn(Person.Sex.values()));

Ce qui nous donne :



Ou :

Code Java : S�lectionner tout
sexColumn.setCellFactory(ComboBoxTableCell.forTableColumn(Person.Sex.values()));

Ce qui nous donne :



Dans les deux cas, une boite d�roulante sera affich�e lorsque la valeur passe en mode �dition.

Mis � jour le 30 septembre 2014 bouye

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 �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les 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.