6 votes

JTextField : Comment limiter le nombre de caractères ?

Veuillez consulter le code suivant.

import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class Bean extends JFrame
{
    private JTextField field1, field2, field3, field4;
    private JLabel text;
    private JButton ok, cancel;
    private JPanel centerPanel,southPanel, textPanel;
    private GridLayout grid;
    private FlowLayout flow1, flow2;

    public Bean()
    {
        //Declaring instance Variables

        field1 = new JTextField(10);

        field2 = new JTextField(5);
        field3 = new JTextField(5);
        field4 = new JTextField(5);        
        text = new JLabel("Insert Your Numbers Here");

      AbstractDocument d = (AbstractDocument) field1.getDocument();
      d.setDocumentFilter(new Bean.Field1Listener());

        ok = new JButton("OK");
        cancel = new JButton("Cancel");

        /***********************Creating the main view*************************/
        centerPanel = new JPanel();
        grid = new GridLayout(2,1,1,1);

        //Adding TextFields
        textPanel = new JPanel();
        flow1 = new FlowLayout(FlowLayout.CENTER);
        textPanel.setLayout(flow1);

        textPanel.add(field1);

        //Adding Buttons
        southPanel = new JPanel();
        southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
        southPanel.add(ok);
        southPanel.add(cancel);

        //Creating Center View
        centerPanel.setLayout(grid);
        centerPanel.add(text);
        centerPanel.add(textPanel);

        //Gathering everything together
        getContentPane().add(centerPanel,"Center");
        getContentPane().add(southPanel,"South");

        this.setSize(500,200);
        this.validate();
        this.setVisible(true);
        this.setLocationRelativeTo(null);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private class Field1Listener extends DocumentFilter
    {

       @Override  
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException  
        {
            if(fb.getDocument().getLength()+string.length()>5)
            {
                return;
            }

            fb.insertString(offset, string, attr);

        }  

        @Override  
        public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException 
        {  

            fb.insertString(offset, "", null);
        }  

        @Override  
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs)throws BadLocationException 
        {  

                 if(fb.getDocument().getLength()+text.length()>5)
                 {
                    System.out.println("OK");
                    return;
                }

                fb.insertString(offset, text, attrs);
        }
    }

    public static void main(String[]args)
    {
        new Bean();
    }
}

Ici, j'essaie de limiter le nombre de caractères à 5. D'accord, il arrête d'insérer des caractères lorsqu'il atteint 5, mais le problème est qu'il ne permet pas non plus de supprimer les caractères insérés, de les remplacer ou quoi que ce soit. Comment corriger ce problème ?

8voto

Basilio German Points 1743

Il suffit de changer votre méthode de suppression actuelle :

 @Override  
 public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException 
 {  

     fb.insertString(offset, "", null);
 } 

pour celui-ci :

 @Override  
 public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException 
 {  
     fb.remove(offset, length);
 }

cela devrait maintenant fonctionner.

5voto

Hidde Points 3318

Vous devriez créer votre propre classe qui vérifie si vous avez donné plus de données que la longueur maximale autorisée : Voir un exemple sur http://www.java2s.com/Tutorial/Java/0240__Swing/LimitJTextFieldinputtoamaximumlength.htm .

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