3 votes

Existe-t-il un moyen de mettre un deux-points dans un champ jtext pour qu'il ne puisse pas être supprimé ?

Je veux qu'un utilisateur puisse saisir l'heure, par exemple 12:00, mais je dois résoudre quelques problèmes et je suis complètement perdu.

  1. Puis-je limiter le texte à 5 caractères et comment ?
  2. Puis-je avoir un deux-points incorporé dans le code afin qu'il ne puisse pas être supprimé par l'utilisateur ?
  3. Enfin, puis-je prendre ce code et vérifier qu'il ne s'agit que de chiffres (sans tenir compte des deux points, bien sûr) ?

7voto

Hovercraft Full Of Eels Points 161146

La réponse est d'utiliser un JFormattedTextField et un MaskFormatter .

Par exemple :

String mask = "##:##";
MaskFormatter timeFormatter = new MaskFormatter(mask);
JFormattedTextField formattedField = new JFormattedTextField(timeFormatter);

Le compilateur Java exigera que vous attrapiez ou lanciez une ParseException lors de la création de votre MaskFormatter, et veillez donc à le faire.

2voto

Robin Points 23666

Ou alors, abandonnez votre champ de texte et optez pour deux champs. JSpinner séparées par un JLabel contenant les deux points (ou deux JTextField instances).

Je ne suis pas totalement sûr que cette solution sera plus intuitive pour l'utilisateur, mais je le pense.

0voto

guleryuz Points 2000

Une réponse tardive à une vieille question ; faire usage de DocumentFilter peut atteindre ces trois exigences.

un code de qualité hors production peut ressembler à ceci

String TIME_PATTERN = "^\\d\\d:\\d\\d\\s[AP]M$";

final JTextField tf = new JTextField("00:00 AM", 8);

((AbstractDocument)tf.getDocument()).setDocumentFilter(new DocumentFilter() {
    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {

        String text = fb.getDocument().getText(0, fb.getDocument().getLength());

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(text.matches(TIME_PATTERN)) {
            super.replace(fb, offs, length, str, a);
            return;
        }

        text = fb.getDocument().getText(0, fb.getDocument().getLength());

        if(offs == 2 || offs == 5)
            tf.setCaretPosition(++offs);

        if(length == 0 && (offs == 0 ||offs == 1 ||offs == 3 ||offs == 4 ||offs == 6))
            length = 1;

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(!text.matches(TIME_PATTERN))
            return;

        super.replace(fb, offs, length, str, a);

    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException { }

    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { }

});

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