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 :

Comment créer une ComboBox avec auto-completion ?


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 Comment créer une ComboBox avec auto-completion ?
    Très interessant tout ça, Bouye.

    Je pense que JavaFX va encore évoluer, favorablement, je l'espère, même si j'ai l'impression qu'ils est encore très peu connu (?)

    Quant au combobox autocomplete cela m'ettone que Oracle (et Sun par le passé) n'ont jamais proposé un composant de ce type fait maison, étant donné son grande utilité dans la programmation.

    En tout cas, si tu trouves quelque chose par rapport à cela, je suis preneur, d'autant plus que dans mon application j'utilise pas mal de donnés avec de combo qui se remplissent depuis une base de données. C'est très facile commencer à taper des noms de villes et voir qu'elles commencent se montrer selon ce que l'on tape dans le clavier

    Il y a ici quelque chose que je n'arrive pas faire marcher chez moi, je pense qu'il a été fait pour une version plus ancienne de JavaFX: http://blog.ngopal.com.np/2011/07/04...ustom-control/

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Pour info, Scene Builder 2.0 a implémenté ce que tu veux faire avec un TextField + ContextMenu, ce dernier incluant un CustomMenuItem avec une ListView.
    Le contenu de la ListView est mis à jour à chaque caractère tapé dans le TextField.
    Le code se trouve sur OpenJDK, tu peux trouver le code avec les liens ci-dessous.

    http://hg.openjdk.java.net/openjfx/8...estEditor.fxml
    http://hg.openjdk.java.net/openjfx/8...estEditor.java

  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
    Merci JC,

    J'ai essayé de mettre en place l'exemple indiqué, mais j'ai pas mal d'erreurs, en commencat par les premières lignes du code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    package com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors;
     
    import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
    Il y a presque rien d'info sur la classe AutoSuggestEditor sur le toile

  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
    Le code source de SceneBuilder est intégralement visible en naviguant via les liens donnés plus haut.
    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
    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
    Pour ceux que ca interresse, voici un prototype que j'ai fait il y a quelques temps qui peut donner une idee de comment la chose peut fonctionner .

    1) Ici une premier approche en étendant ComboBox. Cela implique donc d’accéder a la skin et de remplacer la liste d’éléments qui est affichée par le popup par une FilteredList.
    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
    public final class AutoFillComboBox<T> extends ComboBox<T> {
     
        private final AutotFillSupport<T> autoFillSupport = new AutotFillSupport<>(this);
     
        public AutoFillComboBox2() {
            super();
            getStyleClass().add("auto-fill-combo-box");
        }
     
        private static class AutotFillSupport<V> {
     
            private final AutoFillComboBox2 comboBox;
            private final StringBuilder StringBuilder = new StringBuilder();
            private final FilteredList<V> data;
     
            public AutotFillSupport(AutoFillComboBox2<V> comboBox) {
                this.comboBox = comboBox;
                data = new FilteredList<>(comboBox.getItems());
                comboBox.addEventFilter(KeyEvent.KEY_PRESSED, this::hideCombo);
                comboBox.addEventFilter(KeyEvent.KEY_RELEASED, this::fillCombo);
            }
     
            private void hideCombo(final KeyEvent keyEvent) {
                comboBox.hide();
            }
     
            private void fillCombo(final KeyEvent keyEvent) {
                if (keyEvent.isControlDown()) {
                    return;
                }
                final TextField comboEditor = comboBox.getEditor();
                final String comboText = comboEditor.getText();
                System.out.println(keyEvent.getCode());
                int anchorPosition = comboEditor.getAnchor();
                int caretPosition = comboEditor.getCaretPosition();
                System.out.printf("current text: \"%s\"", comboText).println();
                switch (keyEvent.getCode()) {
                    case HOME:
                    case END:
                    case TAB:
                    case SHIFT:
                        return;
                    case RIGHT:
                        caretPosition = Math.max(comboText.length(), caretPosition + 1);
                        break;
                    case LEFT:
                        caretPosition = Math.max(0, caretPosition - 1);
                        break;
                    case UP:
                        comboEditor.positionCaret(comboText.length());
                        break;
                    case DOWN:
                        if (!comboBox.isShowing()) {
                            comboBox.show();
                        }
                        return;
                    case BACK_SPACE:
                        caretPosition = Math.max(0, caretPosition - 1);
                        break;
                    case DELETE:
                        break;
                    default:
                }
                final String toSearch = (caretPosition <= 0 && anchorPosition <= 0) ? comboText : comboText.substring(0, caretPosition);
                System.out.printf("search text: \"%s\"", toSearch).println();
                data.setPredicate(value -> {
                    final String text = (value == null) ? "" : value.toString();
                    return toSearch.trim().isEmpty() ? true : text.startsWith(toSearch);
                });
                ((ComboBoxListViewSkin) comboBox.getSkin()).getListView().setItems(data);
                if (!data.isEmpty()) {
                    comboBox.show();
                    Platform.runLater(() -> {
                        final String newText = toSearch.isEmpty() ? "" : data.get(0).toString();
                        comboEditor.setText(newText);
                        comboEditor.selectRange(newText.length(), toSearch.length());
                    });
                }
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final AutoFillComboBox<String> nameCombo = new AutoFillComboBox<>();
    nameCombo.getItems().setAll("Anne", "Antoine", "Barbara", "Céline", "Christophe", "Fabienne", "Fabrice", "Lara", "Laurent", "Marie", "Marius", "Sophie", "Steve", "Valérie", "Victor");
    nameCombo.setEditable(true);
    StackPane root = new StackPane();
    root.getChildren().add(nameCombo);
    Scene scene = new Scene(root, 300, 250);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
    Le principal soucis qui m'a fait arrêter le dev c'est que, a priori, il m'est impossible de stopper ou de remplacer les gestionnaires d’événements par défaut pour certaines actions : ainsi si on tape "Fa", la liste affichée contient bien "Fabienne" et "Fabrice", le combo contient "Fa" + "bienne" qui est sélectionné. Jusque la no soucy. Mais si on a le malheur d'appuyer sur la touche bas, c'est le gestionnaire d’événements par défaut qui s'active et donc c'est "Anne" (qui n'est pourtant pas dans la liste visible) qui est sélectionné (le gestionnaire d'event dans la skin doit prendre le premier item de la liste complète). Pour pallier cela, il faudrait sans doute encore plus bidouiller la skin en lui rajoutant des listeners et en consommant les événements et c'est pas génial.

    Une autre solution consisterai a modifier la liste des getItems() de la combo mais je m'y refuse : le filtrage ne modifie pas le contenu de la combo, il cache juste dans le popup les valeurs non acceptées donc on ne devrait pas avoir a modifier la liste getItems() en cours de manipulation.

    2) J'ai ensuite commencé a implémenter une skin mais ça devient un peu lourdingue car il faut aller zieuter (via les sources de l'OpenJFX) dans pas moins de 3 classes différentes (ComboBoxListViewSkin, ComboBoxPopupControl et ComboBoxBaseSkin) donc on se perd vite sur comment implémenter la chose. Sans compter le fait que si l'API skin est bien publique dans le JDK8, ce n'est pas le cas de l'API Behavior. Et, outre le fait que c'est pas portable en JDK7, l'API Skin publique est en fait assez différente et moins facile a utiliser je trouve que l'API Skin privée... bon bref j'ai laissé tombé aussi.

    3) la 3eme approche est peut-etre celle qui permet d'avoir le meilleur résultat en se cassant moins la tête : créer une nouvelle classe AutoFillComboBox qui étend Region et inclure dedans une ComboBox :
    • getItems() sur AutoFillComboBox est la liste manipulée par le programmeur, elle contient tous les éléments.
    • getItems() sur la ComboBox interne, ici la liste de la combo est en fait une FilteredList sur laquelle on appliquera le filtre obtenu via la valeur tapée dans l’éditeur. Comme c'est directement la liste de la combo, plus besoin de faire la manip du test 1 ou on remplace la liste affichée dans le popup donc plus besoin d’accéder a la skin.
      A noter que pour un port JDK7, comme il n'est pas possible d'utiliser FilteredList, il faut alors créer une sous-liste a partir du prédicat et de la liste d'origine.


    L'ennui c'est que comme c'est un nouveau contrôle, il faut retaper toutes les propriétés utiles de la ComboBox dans la classe AutoFillComboBox et les forwarder (via binding) a la combo interne. J'ai donc eut un coup de blues et je me suis arrêté a la phase conceptuelle
    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

  6. #6
    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
    Voici un prototype pour la 3eme approche :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    public final class AutoFillComboBox<T> extends Region {
     
        private final ComboBox<T> comboBox = new ComboBox<>();
     
        public AutoFillComboBox() {
            super();
            getStyleClass().add("auto-fill-combo-box");
            getChildren().add(comboBox);
            comboBox.setItems(filteredItems);
            comboBox.editableProperty().bind(editableProperty());
            // @todo Bind all other properties here.
            comboBox.addEventFilter(KeyEvent.KEY_PRESSED, this::hideCombo);
            comboBox.addEventFilter(KeyEvent.KEY_RELEASED, this::fillCombo);
            //
            setMinSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
            setPrefSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
            setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
        }
     
        @Override
        protected void layoutChildren() {
            super.layoutChildren();
            final Insets insets = getInsets();
            final double width = getWidth();
            final double height = getHeight();
            layoutInArea(comboBox, insets.getLeft(), insets.getTop(), width - (insets.getLeft() + insets.getRight()), height - (insets.getTop() + insets.getBottom()), 0, HPos.LEFT, VPos.TOP);
        }
     
        ////////////////////////////////////////////////////////////////////////////
        private void hideCombo(final KeyEvent keyEvent) {
            comboBox.hide();
        }
     
        private void fillCombo(final KeyEvent keyEvent) {
            if (keyEvent.isControlDown()) {
                return;
            }
            final TextField comboEditor = comboBox.getEditor();
            final String comboText = comboEditor.getText();
            System.out.println(keyEvent.getCode());
            int anchorPosition = comboEditor.getAnchor();
            int caretPosition = comboEditor.getCaretPosition();
            System.out.printf("current text: \"%s\"", comboText).println();
            switch (keyEvent.getCode()) {
                case HOME:
                case END:
                case TAB:
                case SHIFT:
                    return;
                case RIGHT:
                    caretPosition = Math.max(comboText.length(), caretPosition + 1);
                    break;
                case LEFT:
                    caretPosition = Math.max(0, caretPosition - 1);
                    break;
                case UP:
                    comboEditor.positionCaret(comboText.length());
                    break;
                case DOWN:
                    if (!comboBox.isShowing()) {
                        comboBox.show();
                    }
                    return;
                case BACK_SPACE:
                    caretPosition = Math.max(0, caretPosition - 1);
                    break;
                case DELETE:
                    break;
                default:
            }
            final String toSearch = (caretPosition <= 0 && anchorPosition <= 0) ? comboText : comboText.substring(0, caretPosition);
            System.out.printf("search text: \"%s\"", toSearch).println();
            filteredItems.setPredicate(value -> {
                final String text = (value == null) ? "" : value.toString();
                return toSearch.trim().isEmpty() ? true : text.startsWith(toSearch);
            });
            if (!filteredItems.isEmpty()) {
                comboBox.show();
                Platform.runLater(() -> {
                    final String newText = toSearch.isEmpty() ? "" : filteredItems.get(0).toString();
                    comboEditor.setText(newText);
                    comboEditor.selectRange(newText.length(), toSearch.length());
                });
            }
        }
     
        ////////////////////////////////////////////////////////////////////////////
        private final ListProperty<T> items = new SimpleListProperty(this, "items", FXCollections.observableList(new LinkedList<>())); // NOI18N.
        private final FilteredList<T> filteredItems = new FilteredList<>(items);
     
        public final ObservableList<T> getItems() {
            return items.get();
        }
     
        public final void getItems(final ObservableList<T> value) {
            items.set(value);
        }
     
        public final ListProperty<T> itemsProperty() {
            return items;
        }
     
        private final BooleanProperty editable = new SimpleBooleanProperty(this, "editable"); // NOI18N.
     
        public final boolean isEditable() {
            return editable.get();
        }
     
        public final void setEditable(final boolean value) {
            editable.set(value);
        }
     
        public final BooleanProperty editableProperty() {
            return editable;
        }
     
        // @todo Implement all other properties from ComboBox here!
    }
    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

  7. #7
    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
    Merci Bouye,

    Je ferais mes essais dès que j'aurais du temps disponible.

  8. #8
    Invité
    Invité(e)
    Par défaut
    SwingX dispose également d'un composant de ce type

  9. #9
    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
    Certes, mais on est pas en Swing là et le code de CombBox (version JavaFX) et de JCombBox n'ont pas grand chose à voir tant au niveau de la skin que du contrôle lui-même
    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

  10. #10
    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,

    Je reviens sur cette discussion car mon projet s'est arreté à cause de ne pas trouver encore une solution pour faire un combobox avec auto-completion, j'ai cherché par tout sans succès.

    Il y a un code qui fait la fonction d'auto-completer, mais je n'arrive pas a pouvoir remplir ce combobox en prenant deux colonnes depuis une base de données, en montrant une seule colonne et en recuperant la colonne cachée (ID) de la ligne choisie pour le stocker.

    Voici le code:

    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
    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) {
     
            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;
        }
     
    }
    Pour l'appeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new AutoCompleteComboBoxListener<>(comboBox);
    Merci si quelqu'un peut me donner un coup de main.

Discussions similaires

  1. [Lazarus] Comment créer une DLL avec Lazarus
    Par rajawi00 dans le forum Lazarus
    Réponses: 1
    Dernier message: 19/07/2007, 13h49
  2. [VBA-E] Comment remplir une comboBox avec une macro
    Par Tchupacabra dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2007, 11h16
  3. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  4. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04

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