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�sComboBox (4)
pr�c�dent sommaire suivant
 

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.

Mis � jour le 26 septembre 2014 bouye

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());

Mis � jour le 26 septembre 2014 bouye

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);

Mis � jour le 26 septembre 2014 bouye

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.

Mis � jour le 26 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.