2012-05-14 22 views
6

Por favor, eche un vistazo al siguiente código.JTextField: ¿Cómo limitar el número de charaters?

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(); 
    } 

} 

En aquí, yo estoy tratando de limitar el número de caracteres a 5. Aceptar, se detiene insertar más caracteres cuando llega a 5, pero el caso es, sino que también no permite borrar los caracteres insertados , reemplazar o cualquier cosa. Por favor, ayúdame a corregir este problema. Gracias

Respuesta

8

simplemente cambiar su método remove actual:

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

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

para éste:

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

ahora debería funcionar.

+1

¡Guau! ¡Asombroso! ¡Muchas gracias! –

+1

¡De hecho, una solución muy agradable! +1 – Hidde

+0

Este es un enfoque muy complicado, me refiero a 'FieldListener'. – TiMr

Cuestiones relacionadas