Duplicate :
|
It would be useful, if TextField/TextInputControl had some properties, which allow the developer to restrict the user input. e.g. some useful properties would be: maxLength (user cannot input more than X characters, as it exists in HTML). restrict (as it exists in Flex: http://livedocs.adobe.com/flex/3/html/help.html?content=Working_with_Text_11.html ) Please also consider, that input can happen by context menu and CTRL+V, too (do not rely on KeyEvents). Sample: import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.control.TextField; /** * A text field, which restricts the user's input. */ public class AdvancedTextField extends TextField { private StringProperty restrict = new SimpleStringProperty(); private IntegerProperty maxLength = new SimpleIntegerProperty(-1); public int getMaxLength() { return maxLength.get(); } /** * Sets the max length of the text field. * * @param maxLength The max length. */ public void setMaxLength(int maxLength) { this.maxLength.set(maxLength); } /** * Sets a regular expression character class which restricts the user input.<br/> * E.g. [0-9] only allows numeric values. * * @param restrict The regular expression. */ public void setRestrict(String restrict) { this.restrict.set(restrict); } public String getRestrict() { return restrict.get(); } public StringProperty restrictProperty() { return restrict; } public IntegerProperty maxLengthProperty() { return maxLength; } public AdvancedTextField() { textProperty().addListener(new ChangeListener<String>() { private boolean ignore; @Override public void changed(ObservableValue<? extends String> observableValue, String s, String s1) { if (ignore) return; if (maxLength.get() > -1 && s1.length() > maxLength.get()) { ignore = true; setText(s1.substring(0, maxLength.get())); ignore = false; } if (restrict.get() != null && !restrict.get().equals("") && !s1.matches(restrict.get() + "*")) { ignore = true; setText(s); ignore = false; } } }); } }