2016-05-20 12 views
0

Ich habe ein ungewöhnliches Problem, etwas funktioniert zu gut. Ich habe eine DocumentFilter Hexe geschrieben, die Benutzereingaben nur als Zahlen erlaubt, DocumentFilter fügen Sie hinzu, daß Strich an seinem eigenen richtigen Platz während des Schreibens ist. Auf diese Weise in JTextField ist sichtbares Datum wie folgt: "2016-05-01". Das Problem ist, dass JTextField nicht immer vom Benutzer ausgefüllt wird, manchmal muss es vom Programm festgelegt werden. Aber wenn ich code setText ("2016-05-01") verwende, wird es nicht richtig angezeigt, alle Dash sind weg. Wie funktioniert es? Ich habe versucht, DocumentFilter zu ändern, um Dash zu erlauben, aber das verursacht warum Probleme in vielen anderen Orten. Ich werde wahrscheinlich am Ende schreiben ein anderes DocumentFilter nur dafür, aber vielleicht gibt es einen anderen Weg? Ist es möglich, JTextField char von char anhängen? Gibt es eine Möglichkeit, einen aus der DocumentFilter einzuschalten, oder vielleicht ist es möglich, DocumentFilter smart zu ändern, so wird es nicht in oder Plätze knacken und hier auch arbeiten? Im Folgenden Teil des Codes für DocumentFilterMaking JTextField akzeptieren gemischte String, wetzen Sie documentFIlter nur die Ziffern

public void replace(FilterBypass fb, int offs, int length, String str, 
    AttributeSet a) throws BadLocationException { 

if (str == null || str.equals("")) 
{ 
    super.replace(fb, offs, length, str, a); 
} 
else 
{ 
    StringBuffer buffer = new StringBuffer(str); 
    for (int i = buffer.length() - 1; i >= 0; i--) 
    { 
    char ch = buffer.charAt(i); 
    if (!Character.isDigit(ch)) 
    { 
     buffer.deleteCharAt(i); 
    } 
    } 

    str = buffer.toString(); 
    //sign and sign2 is char number were separator(sep) is written 
    if (fb.getDocument().getLength() + str.length() == sign) 
    { 
    str = str + sep; 
    } 
    if (fb.getDocument().getLength() + str.length() == sign2) 
    { 
    str = str + sep; 
    } 


    if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters) 
    super.replace(fb, offs, length, str, a); 
    else 
    Toolkit.getDefaultToolkit().beep(); 
} 
+0

Haben Sie versucht, 'setText ("20160501") '? – Titus

+0

Ja, es gibt das gleiche Ergebnis wie "2016-05-01". In beiden Fällen zeigt es 20160501 – Majlena

Antwort

0

Sie können etwas tun:

@Override 
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException { 
    if (str == null || str.equals("")) { 
     super.replace(fb, offs, length, str, a); 
    } else { 
     // check if 'str' contains 8 digits 
     if (str.matches("^\\d{8}$")) { 
      // add the dashes 
      super.replace(fb, offs, length, str.replaceAll("(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3"), a); 
     } else { 
      StringBuffer buffer = new StringBuffer(str); 
      for (int i = buffer.length() - 1; i >= 0; i--) { 
       char ch = buffer.charAt(i); 
       if (!Character.isDigit(ch)) { 
        buffer.deleteCharAt(i); 
       } 
      } 

      str = buffer.toString(); 
      // sign and sign2 is char number were separator(sep) is written 
      if (fb.getDocument().getLength() + str.length() == sign) { 
       str = str + sep; 
      } 
      if (fb.getDocument().getLength() + str.length() == sign2) { 
       str = str + sep; 
      } 

      if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters) 
       super.replace(fb, offs, length, str, a); 
      else 
       Toolkit.getDefaultToolkit().beep(); 
     } 
    } 
} 

und stellen Sie den Text dieser mit:

textField.setText("20160420"); 
+0

Arbeit wie ein Charme, danke :) – Majlena