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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Remplir combobox avec des valeurs pairs (Integer, String) montrer chaine et récupérer l'entier


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut Remplir combobox avec des valeurs pairs (Integer, String) montrer chaine et récupérer l'entier
    Bojour,

    Je viens vers vous car je bloque sur une chose que l'on pouvait faire avec une certaine simplicité avec Swing.

    Il s'agit d'une combobox qui est remplie avec des valeurs comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       private final ObservableList<Couple> data1 =
             FXCollections.observableArrayList(
                new Couple(1,"Azamat","Desc1"),
                new Couple(2,"Azamati","Desc2"),
                new Couple(3,"Azamat3","zzz"),
                new Couple(4,"Azamat4","yyy"),
                new Couple(5,"Azamat5","aaa"),
                new Couple(6,"Veli","bbb"),
                new Couple(7,"Azemat1","ccc"),
                new Couple(8,"Azemat2","ddd"),
                new Couple(9,"Azemat3","eee"),
                new Couple(10,"Nurbek","fff"));

    Ma combo est plus au moins comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
           ComboBox<Couple> comboCouple = new ComboBox<>();
            comboCouple.setEditable(true);
            comboCouple.setItems(data1) ;
            new AutoCompleteComboBoxListener(comboCouple);
            comboCouple.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Couple>() {
     
                @Override
                public void changed(ObservableValue<? extends Couple> arg0, Couple arg1, Couple arg2) {
                    if (arg2 != null) {
                        System.out.println("Selected: " + arg2.getPremier());
                    }
                }
            });
    Je peux avoir la valeur numérique sans problème (getPremier) SEULEMENT si je choisis une valeur qui existe dans la combo, mais des que j'écris une valeur inexistente ou que je essaie de lui appliquer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new AutoCompleteComboBoxListener(comboCouple);
    J'ai droit à l'erreur:

    java.lang.ClassCastException: java.lang.String cannot be cast to es.ioseph.inicio.Couple
    J'ai lu quelque chose de appliquer un StringConverter lorsqu'on travaille avec des combobox editables, j'ai essayé quelques exemples de StringConverter sans succes.

    Ma classe Couple est ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        public class Couple<T, U, V> {
        private T x;
        private U y;
        private V z;
     
        public Couple (T premier, U second, V descr){
        	x = premier; y=second;z=descr;
        }
        public T getPremier(){
        	return x;
        }
     
        public U getSecond(){
        	return y;
        }
        public V getDescr(){
        	return z;
        }
        public void affiche(){
        	System.out.println("1er: "+ x + " * 2me: "+ y);
        }
        public String toString()
        {
        	return (String) y; 
        } 
     
        }
    Merci si quelqu'un peut me donner des idées.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bon, j'ai un peu de temps pour me pencher sur ca. Il va me falloir le code du listener d'autocompletion pour faire le test au complet. Ce n'est pas forcement le même que celui de l'autre topic j'imagine.

    Par contre, ce que je peux voir déjà c'est qu'il manque un convertisseur. Par défaut ComboBox travaille avec des String et dans le cas ou on travaille avec un type custom, il faut fournir un convertisseur. Ce n'est pas la peine d'en fournir un quand elle n'est pas éditable, mais quand elle est éditable il en faut un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
            comboCouple.setConverter(new StringConverter<Couple>() {
     
                @Override
                public String toString(Couple object) {
                    return object == null ? null : object.toString();
                }
     
                @Override
                public Couple fromString(String string) {
                    for (Couple couple : data1) {
                        if (couple.getSecond().equals(string)) {
                            return couple;
                        }
                    }
                    return null;
                }
            });
    la seconde méthode peut servir a instancier un nouveau couple si on entre une nouvelle valeur, ici j'ai retourne null puisque je ne sais pas trop ce qu'il faut faire.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Desolé repondre avec du retard.

    Ici le code de l'AutoComplete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.EventHandler;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.ListView;
    import javafx.scene.input.KeyCode;
    import javafx.scene.input.KeyEvent;
     
    public class AutoCompleteComboBoxListener<T> implements EventHandler<KeyEvent> {
     
        private ComboBox comboBox;
        private StringBuilder sb;
        private ObservableList<T> data;
        private boolean moveCaretToPos = false;
        private int caretPos;
     
        public AutoCompleteComboBoxListener(final ComboBox comboBox) {
            this.comboBox = comboBox;
            sb = new StringBuilder();
            data = comboBox.getItems();
     
            this.comboBox.setEditable(true);
            this.comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
     
                @Override
                public void handle(KeyEvent t) {
                    comboBox.hide();
                }
            });
            this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
        }
     
        @Override
        public void handle(KeyEvent event) {
            ListView lv = ((ComboBoxListViewSkin) comboBox.getSkin()).getListView();
     
            if(event.getCode() == KeyCode.UP) {
                caretPos = -1;
                moveCaret(comboBox.getEditor().getText().length());
                return;
            } else if(event.getCode() == KeyCode.DOWN) {
                if(!comboBox.isShowing()) {
                    comboBox.show();
                }
                caretPos = -1;
                moveCaret(comboBox.getEditor().getText().length());
                return;
            } else if(event.getCode() == KeyCode.BACK_SPACE) {
                moveCaretToPos = true;
                caretPos = comboBox.getEditor().getCaretPosition();
            } else if(event.getCode() == KeyCode.DELETE) {
                moveCaretToPos = true;
                caretPos = comboBox.getEditor().getCaretPosition();
            }
     
            if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT
                    || event.isControlDown() || event.getCode() == KeyCode.HOME
                    || event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
                return;
            }
     
            ObservableList list = FXCollections.observableArrayList();
            for (int i=0; i<data.size(); i++) {
                if(data.get(i).toString().toLowerCase().startsWith(
                    AutoCompleteComboBoxListener.this.comboBox
                    .getEditor().getText().toLowerCase())) {
                    list.add(data.get(i));
                }
            }
            String t = comboBox.getEditor().getText();
     
            comboBox.setItems(list);
            comboBox.getEditor().setText(t);
            if(!moveCaretToPos) {
                caretPos = -1;
            }
            moveCaret(t.length());
            if(!list.isEmpty()) {
                comboBox.show();
            }
        }
     
        private void moveCaret(int textLength) {
            if(caretPos == -1) {
                comboBox.getEditor().positionCaret(textLength);
            } else {
                comboBox.getEditor().positionCaret(caretPos);
            }
            moveCaretToPos = false;
        }
     
    }
    J'ai essayé de mettre un Convertisseur, mais sans succès.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Aucun soucis pour moi, cela fonctionne bien.

    Nom : test.jpg
Affichages : 1630
Taille : 15,9 Ko

    Et quand je tape une valeur qui n'existe pas dans la combo, il ne se passe rien de spécial (pas d'exception).

    Je suis en JDK8.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut
    Bonjour Bouye,

    ça marche parfaitement

    Sans doute je me trompais en appliquant mon convertisseur.

    Quant á la seconde méthode je voudrais, lorsque l'utilisateur introduit des données qui n'existent pas dans la combobox, récupérer ces valeurs textuels pour les insérer dans une base de données.

    Supposons que l'utilisateur écrit: Anne Marie … ce prénom je voudrais le récupérer (pour exemple dans un map…) pour l'insérer dans la base de données au moment d'appuyer sur un bouton "Enregistrer" ou "Modifier"

Discussions similaires

  1. [XL-2010] remplir Combobox à partir des valeurs de deux combobox
    Par Shini28 dans le forum Excel
    Réponses: 0
    Dernier message: 13/01/2015, 14h27
  2. [XL-2007] Charger une ComboBox avec des valeurs dépendants d'OptionBox
    Par brunounours dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/05/2012, 14h55
  3. [XL-2003] Trier combobox avec des valeurs numériques sans doublon
    Par goldfinger13 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/02/2012, 20h31
  4. Remplir Combobox Avec des données Access
    Par hackman61 dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/03/2011, 18h01
  5. [Débutant] Liste avec des valeurs associées aux string
    Par Bouillou dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo