2017-02-10 3 views
0

derzeit an einem Textfeld zu arbeiten, wo, wenn Sie Eingabe Ihrer Nummer sie es aktualisiert mag:JavaFX: Aktualisieren einer Telefonnummer Textfeld mit Hashtags und Zahlen leben

1 ## - ### - ####

12 # - ### - ####

Leider funktioniert es über die Konsole zu arbeiten, um eine Eingabe "1234" in "123-4 ## - ####" zu konvertieren, obwohl, wenn ich drücke aktualisierte Zeichenkette "123-4 ## - ####" ersetzt automatisch die Cursor-Sektion bis zum Anfang, wo sie ständig die erste Ziffer ersetzen würde. Kann jemand helfen, die Cursorposition beim Aktualisieren der Zeichenfolge in der Textbox zu speichern? Hier ist mein Update-Code.

phoneField.textProperty().addListener((observable, oldValue, newValue) -> { 
     Pattern p = Pattern.compile("-?\\d+"); 
     Matcher m = p.matcher(newValue); 
     String result = ""; 
     String finalString = ""; 
     try { 
      while (m.find()) { 
       result = m.group(); 
      } 
      int size = result.length(); 
      for(int i = 0; i < size; i++) { 
       if(i == 3 || i == 6) finalString += "-"; 
       finalString += result.charAt(i); 
      } 
      for(int i = size; i < 10; i++) { 
       if(i == 3 || i == 6) finalString += "-"; 
       finalString += "#"; 
      } 
     } catch (Exception e) { 
      finalString = "INVALID NUMBER"; 
     } 
     phoneField.setText(finalString); 
    }); 
+0

Vielleicht 'TelefonFeld. positionCaret (newValue.length()) '? –

+0

Leider setzt das meine Caret immer auf das Ende des Textes – Nom

+0

@Nom hey, hast du meine Lösung ausprobiert? – Enigo

Antwort

0

Es gibt nur wenige Änderungen, die ich an Ihrem Code vorgenommen haben. Zunächst sollten Sie das Ergebnis der Übereinstimmungen anhängen, um den richtigen Wert zu erhalten - ich habe StringBuilder.append() dafür verwendet. Dann habe ich das Kompilierungsmuster geändert, sonst würde es die Eingabe nicht korrekt verarbeiten.

phoneField.textProperty().addListener((observable, oldValue, newValue) -> { 
    Pattern p = Pattern.compile("\\d+"); 
    Matcher m = p.matcher(newValue); 
    StringBuilder result = new StringBuilder(); 
    String finalString = ""; 
    try { 
     while (m.find()) { 
      result.append(m.group()); 
     } 
     int size = result.length(); 
     for (int i = 0; i < size; i++) { 
      if (i == 3 || i == 6) finalString += "-"; 
      finalString += result.charAt(i); 
     } 
     for (int i = size; i < 9; i++) { 
      if (i == 3 || i == 6) finalString += "-"; 
      finalString += "#"; 
     } 
    } catch (Exception e) { 
     finalString = "INVALID NUMBER"; 
    } 
    phoneField.setText(finalString); 
}); 

Beachten Sie, dass es wahrscheinlich wert ist, eine Längenprüfung für das Feld hinzuzufügen.

0

Sie sollten keinen Listener verwenden, da Sie genau die Eigenschaft ändern, die Sie gerade hören, was bedeutet, dass der Listener zweimal aufgerufen wird. Tatsächlich wird sich eine Endlosschleife ergeben, es sei denn, die StringProperty ist intelligent genug, um eine Änderung nicht auszulösen, wenn der neue Wert dem alten Wert entspricht. (Die meisten JavaBean konformen Klassen verhalten sich so, aber ich bin mir nicht bekannt, dass Garantie dieses Verhalten.)

Für das Verhalten eines TextField- zu beschränken, können Sie in der Regel eine TextFormatter verwenden möchten:

private TextField createPhoneField() { 
    TextField phoneField = new TextField(); 
    phoneField.setPrefColumnCount(12); 

    TextFormatter<String> formatter = 
     new TextFormatter<>(this::addPhoneNumberMask); 
    phoneField.setTextFormatter(formatter); 

    return phoneField; 
} 

private TextFormatter.Change addPhoneNumberMask(
           TextFormatter.Change change) { 

    // Ignore cursor movements, unless the text is empty (in which case 
    // we're initializing the field). 
    if (!change.isContentChange() && 
     !change.getControlNewText().isEmpty()) { 

     return change; 
    } 

    String text = change.getControlNewText(); 
    int start = change.getRangeStart(); 
    int end = change.getRangeEnd(); 

    int anchor = change.getAnchor(); 
    int caret = change.getCaretPosition(); 

    StringBuilder newText = new StringBuilder(text); 

    int dash; 
    while ((dash = newText.lastIndexOf("-")) >= start) { 
     newText.deleteCharAt(dash); 
     if (caret > dash) { 
      caret--; 
     } 
     if (anchor > dash) { 
      anchor--; 
     } 
    } 

    while (newText.length() < 3) { 
     newText.append('#'); 
    } 
    if (newText.length() == 3 || newText.charAt(3) != '-') { 
     newText.insert(3, '-'); 
     if (caret > 3 || (caret == 3 && end <= 3 && change.isDeleted())) { 
      caret++; 
     } 
     if (anchor > 3 || (anchor == 3 && end <= 3 && change.isDeleted())) { 
      anchor++; 
     } 
    } 

    while (newText.length() < 7) { 
     newText.append('#'); 
    } 
    if (newText.length() == 7 || newText.charAt(7) != '-') { 
     newText.insert(7, '-'); 
     if (caret > 7 || (caret == 7 && end <= 7 && change.isDeleted())) { 
      caret++; 
     } 
     if (anchor > 7 || (anchor == 7 && end <= 7 && change.isDeleted())) { 
      anchor++; 
     } 
    } 

    while (newText.length() < 12) { 
     newText.append('#'); 
    } 

    if (newText.length() > 12) { 
     newText.delete(12, newText.length()); 
    } 

    text = newText.toString(); 
    anchor = Math.min(anchor, 12); 
    caret = Math.min(caret, 12); 

    change.setText(text); 
    change.setRange(0, change.getControlText().length()); 
    change.setAnchor(anchor); 
    change.setCaretPosition(caret); 

    return change; 
} 
Verwandte Themen