Je dois restreindre l'entrée dans un TextField aux entiers. Aucun conseil?
Réponses
Trop de publicités?Fil très ancien, mais cela semble plus net et supprime les caractères non numériques s'il est collé.
// force the field to be numeric only
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) {
if (!newValue.matches("\\d*")) {
textField.setText(newValue.replaceAll("[^\\d]", ""));
}
}
});
Je sais que c'est un fil assez ancien, mais pour les futurs lecteurs voici une autre solution que j'ai trouvée assez intuitive :
public class NumberTextField extends TextField
{
@Override
public void replaceText(int start, int end, String text)
{
if (validate(text))
{
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text)
{
if (validate(text))
{
super.replaceSelection(text);
}
}
private boolean validate(String text)
{
return text.matches("[0-9]*");
}
}
Edit : Merci none_ et SCBoy pour vos suggestions d'améliorations.
À partir de JavaFX 8u40, vous pouvez définir un objet TextFormatter sur un champ de texte :
UnaryOperator<Change> filter = change -> {
String text = change.getText();
if (text.matches("[0-9]*")) {
return change;
}
return null;
};
TextFormatter<String> textFormatter = new TextFormatter<>(filter);
fieldNport = new TextField();
fieldNport.setTextFormatter(textFormatter);
Cela évite à la fois la sous-classe et les événements de modification en double que vous obtiendrez lorsque vous ajouterez un écouteur de modification à la propriété text et modifierez le texte dans cet écouteur.