2013-10-11 1 views
0

Voici ce que je dois: un champ de texte dans lequel l'utilisateur peut entrer soit:Mise en forme textfield sur le focus perdu fondée sur la condition

1234567890 ou 11234567890

et il doit être formaté en conséquence comme

123 -456-7890 ou 1 123-456-7890

Essentiellement un numéro de téléphone avec ou sans code de pays. Jusqu'à présent, j'ai un code qui effectue les opérations suivantes:

if (isPhone && !getText().equals(BLANK_STRING)) { 
     int phoneLength = getText().replaceAll("[^0-9]", "").length(); 
     String text = getText().replaceAll("[^0-9]", ""); 
//We call the method to format the entered text after we left the field 
     setPhoneFormatMask(phoneLength, text); 
} 

private void setPhoneFormatMask(int length, String text) { 
    System.out.println("length = " + length); 
    System.out.println("text = " + text); 
    switch (length) { 
     case 10: 
      try { 
       System.out.println("Setting mask"); 
       numberMaskFormat.setMask("###-###-####"); 
      } catch (ParseException ex) { 
       Logger.getLogger(WWNumericFormattedTextField.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      break; 
     case 11: 
      try { 
       System.out.println("setting mask 2"); 
       numberMaskFormat.setMask("# ###-###-####"); 
      } catch (ParseException ex) { 
       Logger.getLogger(WWNumericFormattedTextField.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      break; 
    } 
    setFormatter(numberMaskFormat); 
    System.out.println("n:" + numberMaskFormat.getMask()); 
    setText(text); 
} 

@Override 
public void focusGained(FocusEvent e) { 
    if (isPhone) { 
     try { 
      numberMaskFormat.setMask("**************"); 
     } catch (ParseException ex) { 
      Logger.getLogger(WWFormattedTextField.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     setFormatter(numberMaskFormat); 
    } 
} 

Sortie de la console:

//Application launched 
focus gained 
n2:************** 
//I entered 9051234567 and tabbed out 
Focus lost 
length = 10 
text = 9051234657 
Setting mask 
n:###-###-#### 
Formatted text = - -  
//Tabbed back in 
focus gained 
n2:************** 
//Entered 19051234567 and tabbed out 
Focus lost 
length = 11 
text = 19051234567 
setting mask 2 
n:# ###-###-#### 
Formatted text = 

Je dois conseiller/aide/conseils sur la façon de formater le texte dans le JFormattedTextField après la mise au point est perdue et le formatage varie en fonction du nombre de chiffres ont été saisis.

+0

Puis, lorsque votre champ de texte formaté gagne à nouveau l'accent: sera-t doit changer sa forme de format texte '123-456- 7890 'à' 1234567890'? exigence d'option filaire !! – Sage

+0

En tout cas jeter un oeil à la réponse. voir si cela aide à répondre à vos besoins – Sage

Répondre

0

Première, masque d'utilisation: # pour tout numéro valide, utilise Character.isDigit parce que * œuvres pour tout caractère.

Deuxième, utilisez DefaultFormatterFactory tout en mettant à formatter JFormattedTextFeild:

ftf.setFormatterFactory(new DefaultFormatterFactory(
               new MaskFormatter("######"))); 

ftf est un JFormattedTextFeild. Essayez d'attribuer un input verifier au formatted text field pour vérifier et vérifier le texte lors de la perte de focus. Le InputVarifier appellera une fonction boolean shouldYieldFocus(JComponent input) sur le focus perdre l'événement pour vérifier où il devrait perdre le focus. J'ai écrit un exemple échantillon pour vous, vous pouvez facilement adopter pour répondre à vos besoins:

class myInputVarifier extends InputVerifier 
{ 
    public boolean maskChanged = false; 
    MaskFormatter maskFormatter ; 
    JFormattedTextField ftf; 
    @Override 
    public boolean verify(JComponent input) { 
    if (input instanceof JFormattedTextField) { 
      ftf = (JFormattedTextField)input; 
      maskFormatter = (MaskFormatter) ftf.getFormatter(); 
      ; 
      if(!isValid()) return false; 
          // check with mask ###### first, if valid change the mask 
          // to # ##-### and reset the text 

      if(!maskChanged) 
      { 
       try { 
        String text = ftf.getText(); 
          // get the text formatted as ###### = 112123 
        maskFormatter.setMask("# ##-###"); 
        ftf.setFormatterFactory(
              new DefaultFormatterFactory(maskFormatter)); 
        ftf.setText(text); 
          //resetting the text will be formatted as # ##-### = 1 12-123 
        maskChanged = true; 
       } catch (ParseException ex) { 
        } 

       return isValid(); 
      } 


      } 
      return true; 
    } 

    public boolean isValid() 
    { 
     try { 
      maskFormatter.stringToValue(ftf.getText()); 
      return true; 
     } catch (ParseException pe) { 
      return false; 
      } 
    } 

    @Override 
    public boolean shouldYieldFocus(JComponent input) { 
    return verify(input); 
    } 
} 
Questions connexes