18 votes

Longueur maximale du champ TextField de JavaFX 2.2

Je travaille sur un projet JavaFX 2.2 et j'ai un problème avec l'utilisation de la fonction TextField contrôle. Je souhaite limiter le nombre de caractères qu'un utilisateur pourra saisir dans chaque champ de contrôle. TextField . Cependant, je n'arrive pas à trouver une propriété ou quelque chose comme longueur maximale . Le même problème se pose en Balançoire et a été résolue este manière. Comment résoudre ce problème pour JavaFX 2.2 ?

2voto

Le code ci-dessous repositionne le curseur afin que l'utilisateur n'écrase pas accidentellement ses données.

public static void setTextLimit(TextField textField, int length) {
    textField.setOnKeyTyped(event -> {
        String string = textField.getText();

        if (string.length() > length) {
            textField.setText(string.substring(0, length));
            textField.positionCaret(string.length());
        }
    });
}

1voto

gmatagmis Points 198

Cette méthode permet à TextField de terminer tous les traitements (copier/coller/sans risque). Ne nécessite pas de créer une classe d'extension. Et vous permet de décider ce qu'il faut faire avec le nouveau texte après chaque changement. (le pousser vers la logique, ou le ramener à sa valeur précédente, ou même le modifier).

  // fired by every text property change
textField.textProperty().addListener(
  (observable, oldValue, newValue) -> {
    // Your validation rules, anything you like
      // (! note 1 !) make sure that empty string (newValue.equals("")) 
      //   or initial text is always valid
      //   to prevent inifinity cycle
    // do whatever you want with newValue

    // If newValue is not valid for your rules
    ((StringProperty)observable).setValue(oldValue);
      // (! note 2 !) do not bind textProperty (textProperty().bind(someProperty))
      //   to anything in your code.  TextProperty implementation
      //   of StringProperty in TextFieldControl
      //   will throw RuntimeException in this case on setValue(string) call.
      //   Or catch and handle this exception.

    // If you want to change something in text
      // When it is valid for you with some changes that can be automated.
      // For example change it to upper case
    ((StringProperty)observable).setValue(newValue.toUpperCase());
  }
);

Dans votre cas, il suffit d'ajouter cette logique à l'intérieur. Cela fonctionne parfaitement.

    // For example 10 characters     
  if (newValue.length() >= 10) ((StringProperty)observable).setValue(oldValue);

0voto

Eddy Zavala Points 124

J'ai ce bout de code qui n'autorise que les chiffres et limite la longueur de saisie sur un champ texte en Javafx.

// Event handler for inputPrice
     inputPrice.setOnAction(event2 -> {

            // Obtain input as a String from text field
            String inputPriceStr = inputPrice.getText();

            // Get length of the String to compare with max length
            int length = inputPrice.getText().length();

            final int MAX = 10; // limit number of characters

            // Validate user input allowing only numbers and limit input size
            if (inputPriceStr.matches("[0-9]*") && length < MAX ) {

                 // your code here
             }});

-1voto

private void registerListener1(TextField tf1, TextField tf2,TextField tf3,TextField tf4) {
    tf1.textProperty().addListener((obs, oldText, newText) -> {

        if(newText.length() == 12) {

            tf1.setText(newText.substring(0, 3));
            tf2.setText(newText.substring(tf1.getText().length(), 6));              
            tf3.setText(newText.substring(tf1.getText().length()+tf2.getText().length(), 9));
            tf4.setText(newText.substring(tf1.getText().length()+tf2.getText().length()+tf3.getText().length()));
            tf4.requestFocus();
        }
    });

}

private void registerListener(TextField tf1, TextField tf2) {
    tf1.textProperty().addListener((obs, oldText, newText) -> {
        if(oldText.length() < 3 && newText.length() >= 3) {
            tf2.requestFocus();
        }
    });

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X