2013-09-04 4 views
-1

J'ai un Jtextfield nommé tPvv, a écrit un DocumentFilter pour n'accepter que des nombres, longueur maximale de 3.Et j'ai un bouton éditer, quand je clique sur ce bouton la ligne entière chargée dans les champs de texte pour l'édition depuis le jtable (la valeur dans Jtextfield tPvv reste constante). Les Jtextfield qui sont définis sans documentFilter fonctionnent bien (charge les valeurs de jtable dans les champs de texte en fonction de la sélection de ligne). Aussi quand je commente le DocumentFilter cela fonctionne bien, mais je ne peux pas fournir la validation (accepter le nombre seulement et la longueur de 3).jtextfield documentFilter une fois défini, valeur ne chargeant pas dans le jtextfield

Je dois vérifier la validation du tPvv et charger les valeurs de jtable en fonction de la sélection de ligne différente en cliquant sur le bouton d'édition.

`class NumericAndLengthFilter extends DocumentFilter { 

     /** 
     * Number of characters allowed. 
     */ 
     private int length = 0; 

     /** 
     * Restricts the number of charcacters can be entered by given length. 
     * @param length Number of characters allowed. 
     */ 
     public NumericAndLengthFilter(int length) { 
      this.length = length; 
     } 

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

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String text, 
       AttributeSet attrs) throws 
       BadLocationException { 
      if (isNumeric(text)) { 
       if (this.length > 0 && fb.getDocument().getLength() + text. 
         length() 
         > this.length) { 
        return; 
       } 
       super.insertString(fb, offset, text, attrs); 
      } 
     } 

     /** 
     * This method tests whether given text can be represented as number. 
     * This method can be enhanced further for specific needs. 
     * @param text Input text. 
     * @return {@code true} if given string can be converted to number; otherwise returns {@code false}. 
     */ 
     private boolean isNumeric(String text) { 
      if (text == null || text.trim().equals("")) { 
       return false; 
      } 
      for (int iCount = 0; iCount < text.length(); iCount++) { 
       if (!Character.isDigit(text.charAt(iCount))) { 
        return false; 
       } 
      } 
      return true; 
     } 

} 
//((AbstractDocument) tPvv.getDocument()).setDocumentFilter(new NumericAndLengthFilter(3)); 

`dernière ligne a commenté i défini dans mon code pour l'appel fin de validation. S'il vous plaît résoudre ce problème.

+0

pour un nombre textfield accepter seulement (même avec une longueur limitée), vous pouvez aussi jeter un oeil à [cette question] (http://stackoverflow.com/a/13424140/1076463) – Robin

Répondre

3

Vous ne tenez pas compte essentiellement les paramètres qui sont passés à vous et ce qu'ils veulent dire ...

  • offset est le décalage dans le document où le nouveau text sera inséré ...
  • length est le nombre de caractères à supprimer

maintenant, si nous utilisons le length dans l'instruction if, nous commençons à voir une différence. En fait, lorsque vous appelez setText, le length sera égal au nombre de caractères dans le champ de texte (comme tout le texte est à remplacer) ...

public void replace(FilterBypass fb, int offset, int length, String text, 
       AttributeSet attrs) throws 
       BadLocationException { 
    if (isNumeric(text)) { 

     System.out.println(offset + "; " + length + "; " + text); 

     if (this.length > 0 && 
      fb.getDocument().getLength() + text.length() - length > this.length) { 
      return; 
     } 
     super.replace(fb, offset, length, text, attrs); 
    } 
} 

Vous appelez également super.insertString(fb, offset, text, attrs); dans le replace méthode qui n'est pas utile non plus ...

mise à jour des commentaires

le problème que vous êtes confronté à setText(null) est de faire avec le fait que isNumeric dans votre filtre est Returni ng false pour null et vide (« ») valeurs, mais ce sont en fait valables dans certains contextes ...

Maintenant, vous pouvez modifier la méthode isNumeric, mais qui pourrait nuire aux autres méthodes du filtre, au lieu, nous devrions être placer une condition supplémentaire à replace pour attraper ce cas et traiter de manière appropriée ...

public void replace(FilterBypass fb, int offset, int length, String text, 
       AttributeSet attrs) throws 
       BadLocationException { 
    if (isNumeric(text)) { 

     System.out.println(offset + "; " + length + "; " + text); 

     if (this.length > 0 && 
      fb.getDocument().getLength() + text.length() - length > this.length) { 
      return; 
     } 
     super.replace(fb, offset, length, text, attrs); 
    } else if (text == null || text.equals("")) { 
     super.replace(fb, offset, length, text, attrs); 
    } 
} 
+0

ci-dessus résout le problème mentionné, mais un nouveau problème se pose, lorsque je clique sur le bouton ajouter tous les champs de texte b ecome vide ou vide (j'ai appelé la méthode Textfield.setText (null)) mais la valeur dans le champ de texte tPvv (Docfilter créé pour ce champ JTextField) n'est pas supprimée. – aarav

+0

* "J'ai appelé Textfield.setText (null)" *, mais dans votre 'isNumeric' vous renvoyez false pour les valeurs égales à null et vides. Je reviendrais en considérant renvoyer 'true', mais vous devrez ajouter des vérifications supplémentaires pour' null' 'String's dans vos autres méthodes. Alternativement, ajoutez l'instruction 'else if' à votre méthode' replace' pour inclure la possibilité d'un 'null'' String' et appelez 'super.replace (...)' – MadProgrammer

+0

veuillez me fournir le code complet. – aarav