2016-05-20 11 views
0

У меня необычная проблема, что-то работает немного хорошо. Я написал DocumentFilter, позволяющий вводить пользователя только как цифры, DocumentFilter добавить тире на свое место в нужном месте во время записи. Таким образом, в JTextField видна дата: «2016-05-01». Проблема в том, что JTextField не всегда заполняется пользователем, иногда он должен быть установлен программой. Но когда я использую код setText («2016-05-01»), он не отображается должным образом, все тире исчезли. Как заставить его работать? Я попытался изменить DocumentFilter, чтобы разрешить тире, но это почему вызывает проблемы во многих других местах. Я, вероятно, в конечном итоге напишу еще DocumentFilter только для этого, но, возможно, есть другой способ? Можно ли добавить атрибут JTextField char? Есть ли способ переключиться с DocumentFilter, или, возможно, можно легко изменить DocumentFilter, чтобы он не раздавился в других ладонях и не работал здесь? Ниже часть кода для DocumentFilterСоздание JTextField принимает смешанную строку, whet documentFIlter alow только цифры

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

Вы пробовали 'SetText ("20160501") '? – Titus

+0

Да, он дает тот же результат, что и «2016-05-01». В обоих случаях он показывает 20160501 – Majlena

ответ

0

Вы можете сделать что-то вроде этого:

@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(); 
     } 
    } 
} 

и установить текст с помощью этого:

textField.setText("20160420"); 
+0

Работайте как шарм, спасибо :) – Majlena

 Смежные вопросы

  • Нет связанных вопросов^_^