2009-06-10 8 views
4

J'ai un champ de texte formaté pour adresse ip:Comment définir la valeur d'un objet JFormattedTextField avec un caractère espace réservé?

ipmask = new MaskFormatter("###.###.###.###"); 
ipmask.setPlaceholderCharacter(' '); 
field = new JFormattedTextField(ipmask); 

field.setValue("111.222.333.444"); œuvres, mais

field.setValue(" 10.222.333.444"); ne fonctionne pas

field.setValue("10 .222.333.444"); ne fonctionne pas

field.setValue("10.222.333.444"); ne fonctionne pas

Quelle est la bonne façon de définir le val ue?

+0

Apparemment, le caractère d'espace réservé ne peut être utilisé à la fin de la chaîne. Je ne peux pas trouver un moyen de contourner cela, et je supprime ma réponse incorrecte. –

Répondre

1

Les espaces ne comptent pas comme des nombres (#) et les. compte comme quoi que ce soit. Malheureusement, vous ne pourrez pas faire correspondre une adresse IP avec MaskFormatter, sauf si vous pouvez trouver un moyen d'avoir plusieurs MaskFormatters pour 1 JFormattedTextField.

plus simple

if (field.getValue().matches("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")) //do something 

EDIT: vous devez utiliser un JTextField régulier et valider

+0

Je sais que je peux écrire ma propre classe pour faire cela, mais il sera plus agréable d'avoir des classes Java pour le faire. – 5YrsLaterDBA

5

Plutôt étrange, mais cela est venu dans une autre question (à Java: network settings window). Après avoir creusé se retourne là-bas est une implémentation RegexFormatter de Sun (voir http://java.sun.com/products/jfc/tsc/articles/reftf/, télécharger le code source à http://java.sun.com/products/jfc/tsc/articles/reftf/RegexFormatter.java) que vous pouvez utiliser comme ceci:

JFormattedTextField ipAddress; 
    try{ 
    RegexFormatter ipmask = new RegexFormatter("\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}"); 
     ipmask.setOverwriteMode(false); 
    ipAddress = new JFormattedTextField(ipmask); 
}catch(Exception e1){ 
} 
ipAddress.setValue("255.255.255.255"); 

Vous avez probablement déplacé à partir d'ici, mais pensé que je d coller cela juste au cas où quelqu'un d'autre se promène le long.

0

J'ai essayé d'utiliser le formateur de masque, mais ce n'est pas bon avec notre situation ici, donc j'ai trouvé cette méthode en utilisant Regex et la validation instantanée pour l'entrée de l'utilisateur.

Ce code est généré en utilisant constructeur IUG:

jFormattedTextField2 = new javax.swing.JFormattedTextField(); 
jFormattedTextField2.setHorizontalAlignment(jFormattedTextField2.CENTER); 
jFormattedTextField2.addCaretListener(new javax.swing.event.CaretListener() { 
    public void caretUpdate(javax.swing.event.CaretEvent evt) { 
     jFormattedTextField2CaretUpdate(evt); 
    } 
}); 

Ici, sur chaque mise à jour sur le terrain de l'entrée sera validée à l'aide matcher:

private void jFormattedTextField2CaretUpdate(javax.swing.event.CaretEvent evt) {             
     // validation happen here and the text is red if IP is invalid 
     final String regex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; 
     final Pattern pattern = Pattern.compile(regex); 
     String ip = jFormattedTextField2.getText(); 
     Matcher m = pattern.matcher(ip); 
     jFormattedTextField2.setForeground(Color.red); 
     if (m.matches()) { 
      jFormattedTextField2.setForeground(Color.black); 
     } 
    } 
Questions connexes