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

Composants Java Discussion :

utiliser ComboBox Editable avec PlainDocument


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut utiliser ComboBox Editable avec PlainDocument
    Je n'arrive pas à comprendre la mécanique de fonctionnement de ce couple (BasicComboBox avec PlainDocument). Mon but est de créer une combo éditable qui contienne des valeurs de kilométrage formatées par exemple comme '100.000 km par an'. Lorsque on saisit une nouvelle valeur dans la combo, 14200 par ex., au moment où on quitte la combo la valeur se transforme en '14.200 km par an'.
    J'ai crée les classes suivantes:
    - MyComboBox extends JComboBox
    - EditableKilometrageRenderer extends BasicComboBoxRenderer
    - EditableComboEditor extends BasicComboBoxEditor
    - BoundDocument extends PlainDocument

    Je ne vais citer que l'essentiel du code. Ma classe de base MyComboBox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MyComboBox extends JComboBox {
     String initialText;
    public P2ComboBox(Object[] ob, String initialText) {
            super(ob);
            setSelectedIndex(-1);
            setRequestFocusEnabled(true);
            this.initialText = initialText;
        }
    }
    Voici la création de la combo:
    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
     
     String[] array = {
                "10000",
                "15000",
                "20000",
                "25000",
                "30000",
                "35000",
                "40000",
                "45000",
                "50000",
                "50000",
                "55000",
                "60000"
            };
    MyComboBox cbBox = new MyComboBox(array, "");
            cbBox.setEditable(true);
            cbBox.setRenderer(new EditableKilometrageRenderer());
            EditableComboEditor cbEditor = new EditableComboEditor("choisissez le kilométrage");
            cbBox.setEditor(cbEditor);
    La classe 'Editor':
    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
     
    class EditableComboEditor extends BasicComboBoxEditor {
     
            protected int key = -1;
            protected String initialText;
     
            EditableComboEditor(String initialText) {
                this.initialText = initialText;
                editor.addKeyListener(new KeyAdapter() {
     
                    public void keyPressed(KeyEvent e) {
                        key = e.getKeyCode();
                        return;
                    }
                });
            }
     
            public void setItem(Object o) {
                if (o == null || o.toString().isEmpty()) {
                    return;
                }
                editor.setDocument(new BoundDocument(30));
                if (o != null && !o.toString().equals(initialText)) {
                    try {
                        editor.setText((String) o + " km PAR an");
                    } catch (Exception e) {
                        Log.getLog().info("Exception in setItem:" + e.getMessage());
                    }
                }
                return;
            }
        }
    La classe de 'Document':
    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
     
    public class BoundDocument extends PlainDocument {
    protected int maxLength = 0;
    public BoundDocument(int maxLength) {
            this.maxLength = maxLength;        
        }
     public int getMaxLenght() {
            return maxLength;
        }
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if (str == null) {            
                return;
            }
     
            int afterLength = getLength() + str.length();
     
            if (afterLength > maxLength) {
                Toolkit.getDefaultToolkit().beep();
                return;
            }
     
            super.insertString(offs, str, a);
            return;
        }
    }
    Et enfin le renderer:
    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
     
    class EditableKilometrageRenderer extends BasicComboBoxRenderer {
     
     
            public EditableKilometrageRenderer() {
            }
     
            public Component getListCellRendererComponent(
                    JList list,
                    Object value,
                    int index,
                    boolean isSelected,
                    boolean cellHasFocus) {
     
     
                if (index == -1) {
                    setOpaque(false);
                } else {
                    setOpaque(true);
                }
     
                if ((index != -1) && isSelected) {
                    setBackground(list.getSelectionBackground());
                    setForeground(list.getSelectionForeground());
                } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
                }
     
                setFont(list.getFont());
     
                if (value instanceof Icon) {
                    setIcon((Icon) value);
                } else {
                    setForeground(Color.gray);
                    setBackground(list.getBackground());
                    setText(value + " km par an");
                }
                return this;
            }
        }
    Je n'arrive pas à setter la valeur affiché par défault comme 'Choisissez le kilométrage'; En plus si je saisis une valeur en le tapant dans la combo et je la quitte, j'obtiens 2 fois 'km par an' ajouté à la valeur saisie: 14200 km par an km par an'. Quelqu'un peut m'expliquer comment les choses se passent, qui est-ce que est setté et au quel moment? Merci.

  2. #2
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    Alors personne n'est capable de proposer quoi que ce soit ?Je n'arrive pas à comprendre la mécanique. J'ai compris que la méthode 'setItem' de ComboBoxEditor est appelée chaque fois quand on choisit une valeur à partir de la liste. Mais comment fonctionne 'insertString' dans ma classe 'Document' - pas moyens. Je sais qu'elle est appelé lors de chaque frappe de touche de clavier. Mais je n'arrive pas à:
    - effacer la valeur initiale dans la combo 'Choose your km value'
    - puis afficher 'km per year' constamment après les chiffres tapés.
    Au cas où j'attache le code-source en tout espérant que quelqu'un aura une idée comment remédier à ce problème.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. utilisation d'une combobox gtk avec mono C#
    Par Rachel dans le forum Mono
    Réponses: 1
    Dernier message: 07/11/2011, 20h08
  2. utilisation de edit avec des valeurs numériques
    Par oliv27400 dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 21/06/2010, 18h06
  3. combobox editable avec richfaces
    Par rabebIF5 dans le forum JSF
    Réponses: 1
    Dernier message: 20/05/2009, 18h07
  4. [API Windows] Utiliser le hDC avec un EDIT
    Par Dev-FX dans le forum Visual C++
    Réponses: 3
    Dernier message: 07/04/2007, 15h53
  5. Utilisation du Enable avec des combobox ou des listbox
    Par legos dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 19/09/2006, 22h35

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