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 ?
Réponses
Trop de publicités?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());
}
});
}
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);
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
}});
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();
}
});
}
- Réponses précédentes
- Plus de réponses