98 votes

Quelle est la méthode recommandée pour créer un TextField numérique dans JavaFX ?

Je dois restreindre l'entrée dans un TextField aux entiers. Aucun conseil?

141voto

Evan Knowles Points 3229

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]", ""));
        }
    }
});

43voto

Burkhard Points 6734

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.

40voto

Uwe Points 623

À 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.

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