2010-05-01 19 views

Respuesta

29

Cualquier validación en Swing se puede realizar utilizando un InputVerifier.

1. En primer lugar crear su propio verificador de entrada:

public class MyInputVerifier extends InputVerifier { 
    @Override 
    public boolean verify(JComponent input) { 
     String text = ((JTextField) input).getText(); 
     try { 
      BigDecimal value = new BigDecimal(text); 
      return (value.scale() <= Math.abs(4)); 
     } catch (NumberFormatException e) { 
      return false; 
     } 
    } 
} 

2. A continuación, asigne una instancia de esa clase a su campo de texto. (De hecho, cualquier JComponent puede ser verificado)

myTextField.setInputVerifier(new MyInputVerifier()); 

Por supuesto, también puede utilizar una clase interna anónima, pero si el validador se va a utilizar en otros componentes, también, una clase normal, es mejor.

También eche un vistazo a la documentación de SDK: JComponent#setInputVerifier.

+1

Use 'BigDecimal' en su lugar y luego verifique el número de decimales con' scale() '. –

+0

Gracias, he actualizado el código. –

+0

Gracias por sus sugerencias y fragmentos de código. Trataré de avisarle en caso de que se desconecte – Chandu

0

Probablemente pueda lograr lo mismo con DocumentListener. Todo lo que tiene que hacer es validar la cadena de entrada con el patrón de cadena deseado. En este caso, el patrón parece ser uno o más dígitos, seguido de un punto, Y exactamente 4 dígitos después del punto decimal. El código siguiente muestra cómo utilizar DocumentListener para lograr esto:

public class Dummy 
{ 
    private static JTextField field = new JTextField(10); 
    private static JLabel errorMsg = new JLabel("Invalid input"); 
    private static String pattern = "\\d+\\.\\d{4}"; 
    private static JFrame frame = new JFrame(); 
    private static JPanel panel = new JPanel(); 

    public static void main(String[] args) 
    { 
    errorMsg.setForeground(Color.RED); 
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.insets = new Insets(5, 0, 0, 5); 
    c.gridx = 1; 
    c.gridy = 0; 
    c.anchor = GridBagConstraints.SOUTH; 
    panel.add(errorMsg, c); 

    c.gridx = 1; 
    c.gridy = 1; 
    c.anchor = GridBagConstraints.CENTER; 
    panel.add(field, c); 

    frame.getContentPane().add(panel); 
    field.getDocument().addDocumentListener(new DocumentListener() 
    { 
     @Override 
     public void removeUpdate(DocumentEvent e) 
     { 
     validateInput(); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) 
     { 
     validateInput(); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) {} // Not needed for plain-text fields 
    }); 

    frame.setSize(200, 200); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

    private static void validateInput() 
    { 
    String text = field.getText(); 
    Pattern r = Pattern.compile(pattern); 
    Matcher m = r.matcher(text); 
    if (m.matches()) 
    { 
     errorMsg.setForeground(frame.getBackground()); 
    } 
    else 
    { 
     errorMsg.setForeground(Color.RED); 
    } 
    } 
} 

Mientras el campo de texto no contiene una entrada válida, el mensaje de error se muestra como la siguiente imagen.

invalid input

Una vez validada la entrada, el mensaje de error no será visible.

valid input

Por supuesto, se puede sustituir la acción de validación para lo que necesite. Por ejemplo, es posible que desee mostrar algunas ventanas emergentes cuando se hace clic en un botón si la entrada no es válida, etc.

Tiré esto para mostrar una alternativa a la respuesta ya dada. Puede haber casos en los que esta solución sea más adecuada. Puede haber casos en que la respuesta dada sea más adecuada. Pero una cosa es cierta, las alternativas siempre son buenas.

Cuestiones relacionadas