6 votes

JavaFX 2 ComboBox setValue() ne fixe pas le texte de la CB

Mon problème est que le texte de l'élément sélectionné de la ComboBox n'est pas visible à l'écran après l'avoir sélectionné avec setValue(). Voici quelques détails : Ajout d'éléments à ma CB :

combo.getItems().add("a");
combo.getItems().add("b");
combo.getItems().add("c");
combo.getItems().add("d");

Ensuite, lorsque le bouton A est enfoncé :

combo.setValue(null);

Lorsque le bouton B est enfoncé :

combo.setValue("a");

Maintenant, si j'appuie d'abord sur le bouton B, "a" s'affiche, ce qui est correct. Ensuite, si j'appuie sur le bouton A, aucun texte ne s'affiche dans la ComboBox, c'est correct. J'appuie ensuite sur le bouton B, et la valeur n'a pas changé à l'écran. Cependant, si je clique sur la CB, la ligne correspondant à "a" est mise en évidence et combo.getValue() renvoie "a".

Des suggestions sur la manière de gérer cette situation ?

8voto

Vertex Points 1420

J'ai le même problème. Cela ressemble à un bug. Voici un exemple qui fonctionne parfaitement avec un ComboBox qui contient Locale s :

package org.example;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public final class ComboBoxTest extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        // Initialize UI
        stage.setTitle("ComboBox Test");
        final HBox root = new HBox(5.0f);
        final ComboBox<Locale> cbLocales = new ComboBox<>();
        cbLocales.setConverter(new StringConverter<Locale>() {
            @Override
            public String toString(final Locale locale) {
                return locale.getDisplayName();
            }

            @Override
            public Locale fromString(String string) {
                throw new UnsupportedOperationException();
            }
        });
        cbLocales.setPrefWidth(250);
        HBox.setMargin(cbLocales, new Insets(10));
        root.getChildren().add(cbLocales);
        final Button btnFill = new Button("Fill");
        HBox.setMargin(btnFill, new Insets(10));
        root.getChildren().add(btnFill);
        final Scene scene = new Scene(root);
        stage.setScene(scene);

        btnFill.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(final MouseEvent event) {
                // Fill with content
                final List<Locale> locales = Arrays.asList(Locale.ENGLISH,
                        Locale.GERMAN, Locale.FRENCH);
                final Locale defaultLocale = locales.get(1);
                // cbLocales.getItems.setAll(locales) doesn't work
                cbLocales.getItems().clear();
                cbLocales.getItems().addAll(locales);
                // Set default locale
                cbLocales.setValue(defaultLocale);
                cbLocales.setPromptText(cbLocales.getConverter().toString(
                        cbLocales.getValue()));
            }
        });

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Lorsque le ComboBox rempli pour la première fois, tout fonctionne bien : Le ComboBox contient les 3 Locale et le second Locale est défini.

enter image description here

Après le deuxième remplissage, ComboxBox.setValue ne fonctionne pas : Le ComboBox contient les 3 Locale mais la seconde Locale es no ensemble. Aucun élément n'est sélectionné et aucune invite n'est affichée.

enter image description here

J'ai résolu le problème de l'invite avec

// Set default locale
cbLocales.setValue(defaultLocale);
cbLocales.setPromptText(cbLocales.getConverter().toString(
        cbLocales.getValue()));

mais il ne sélectionne pas l'élément dans la liste :

enter image description here

Il existe une solution de contournement :

cbLocales.getSelectionModel().select(defaultLocale);
cbLocales.setPromptText(cbLocales.getConverter().toString(cbLocales.getValue()));

Pour sélectionner l'élément et définir l'invite. Mais je ne sais pas s'il y a d'autres problèmes avec cela (info-bulles ou autres).

0voto

invariant Points 2928

Lors de la création d'une boîte combo, vous devez instancier définir les éléments comme une liste observable, tout comme les autres contrôles UI tels que ChoiceBox, ListView et TableView.

Exemple de code :

ObservableList<String> options = 
    FXCollections.observableArrayList("A","B","C","D");

combo.setItems(options);

les résultats devraient maintenant être ceux que vous attendiez :) (testé sur ma machine locale)

Référence : Boîte combinée

0voto

Martin Pfeffer Points 85

J'ai constaté un comportement étrange. Il semble que le setItems() ne doit pas se faire avant d'avoir fixé sa "valeur"... Voici un code qui fonctionne pour moi :

 ComboBox<String> editableComboBox = new ComboBox<String>(); // <- setting the items here 
                                                             // brings the "bug"
    editableComboBox.setId("combobox_fields" + i);
    String desciption = pair.getDescription();
    editableComboBox.setValue(desciption);
    editableComboBox.setEditable(true); 
    editableComboBox.setItems(FieldType.FIELD_TYPES); // <- here we go!

Et ici les valeurs..

public static final ObservableList<String> FIELD_TYPES =
            FXCollections.observableArrayList("A", "B", "C",
                                              "D", "E", "F",
                                              "G", "H", "I");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X