Peut on spécifier la longueur maximum de la saisie dans un showInputDialog ?
Merci
Version imprimable
Peut on spécifier la longueur maximum de la saisie dans un showInputDialog ?
Merci
Comme le résultat est un objet String j'aurais tendance a dire : longeur illimité
mais le mieux est d'essayer.
je voudrais en fait que le curseur soit bloqué au bout de 9 caractères (c'est un numéro de SIREN). Je fais deja le controle après pour vérifier la taille mais je voudrais le faire au moment de la saisie...
Une piste peut être:
Sais tu récupérer le textfield et mettre un listener "keypressed" dessus qui annule la frappe si la taille > 9
oué effectivement mais comment :?
Salut,
Une manière de limiter la taille d'un JTextField est d'utiliser un DocumentFilter, et de redéfinir ses méthodes afin de bloquer lorsqu'on dépasse le nombre de caractère, par exemple :
Mais on n'a malheureusement pas accès au JTextField du JOptionPane... C'est pourquoi il faut utiliser showOptionPane() et créer de toutes parts la boite de dialogue, par exemple :Code:
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 public class SizeDocumentFilter extends DocumentFilter { private final int maxLength; public SizeDocumentFilter(int maxLength) { this.maxLength = maxLength; } @Override public void insertString(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException { // Calcul du nombre de caractère qu'il est encore possible d'ajouter : int len = this.maxLength - fb.getDocument().getLength(); if (len <= 0) { // Beep car déja complet Toolkit.getDefaultToolkit().beep(); } else { if (len < text.length()) { // on tronque la chaine si elle est trop grande : text = text.substring(0, len); // Beep car chaine tronqué Toolkit.getDefaultToolkit().beep(); } // Puis on insert la chaine : fb.insertString(offset, text, attrs); } } @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { // Calcul du nombre de caractère qu'il est encore possible d'ajouter // (après avoir enlévé les eventuelles caractères remplacés) : int len = this.maxLength + length - fb.getDocument().getLength(); if (len <= 0) { // Beep car déja complet Toolkit.getDefaultToolkit().beep(); } else { if (len < text.length()) { // on tronque la chaine si elle est trop grande : text = text.substring(0, len); // Beep car chaine tronqué Toolkit.getDefaultToolkit().beep(); } // Puis on effectue le remplacement fb.replace(offset, length, text, attrs); } } }
Mais il y a un défaut : le JTextField n'a pas le focus par défaut...Code:
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 public static String showInputDialog(Component parentComponent, Object message, int maxlen) throws HeadlessException { // On récupère la locale du composant parent (ou celle par défaut) : Locale locale = (parentComponent == null) ? Locale.getDefault() : parentComponent.getLocale(); // On crée un Document auquel on associe le filtre : PlainDocument doc = new PlainDocument(); doc.setDocumentFilter(new SizeDocumentFilter(maxlen)); // On crée le JTextField de saisie : final JTextField textField = new JTextField(doc, null, 0); // On affiche la boite de dialogue int ret = JOptionPane.showOptionDialog( parentComponent, // Composant parent new Object[] { message, textField }, // Contenu de la BdD UIManager.getString("OptionPane.inputDialogTitle",locale), // Titre de la BdD JOptionPane.OK_CANCEL_OPTION, // Bouton OK/Cancel JOptionPane.QUESTION_MESSAGE, // Style "Question" null, null, null); // Si on a cliqué sur OK on retourne le texte if (ret == JOptionPane.OK_OPTION) { return textField.getText(); } // Sinon on retourne null return null; }
Si quelqu'un a une solution pour ca ;)
a++