问题
How can I restrict the input from the user to only hexadecimal values?
With decimal notation the range is from 0 to 16383, but I would like to let the user type an hexadecimal number into TextField
. Therefore the range should be from 0x0000 to 0x3FFF. I have already built my GUI via SceneBuilder
, therefore I just need a function to handle restriction and conversion on user's input.
EDIT
This is my version:
startAddressField.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.matches("^[0-9A-F]?")) {
startAddressField.setText(oldValue);
}
});
回答1:
Use a TextFormatter
with UnaryOperator
and StringConverter<Integer>
as shown below:
UnaryOperator<TextFormatter.Change> filter = change -> change.getControlNewText().matches("[0-3]?\\p{XDigit}{0,3}") ? change : null;
StringConverter<Integer> converter = new StringConverter<Integer>() {
@Override
public String toString(Integer object) {
return object == null ? "" : Integer.toHexString(object);
}
@Override
public Integer fromString(String string) {
return string == null || string.isEmpty() ? null : Integer.parseInt(string, 16);
}
};
TextFormatter<Integer> formatter = new TextFormatter<>(converter, null, filter);
textField.setTextFormatter(formatter);
The converted value is available via TextFormatter.value
property. It only gets updated on pressing enter or the TextField
loosing focus.
回答2:
best way to do it is with regular expressions:
yourTextField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) {
if (!newValue.matches("^[0-9A-F]+$")) {
yourTextField.setText(newValue.replaceAll("[^\\d]", ""));
}
}
});
Is this what your are looking for?
回答3:
An idea may be to parse it into integer format first. You can use:
int value = Integer.decode("your hex value here");
if the string is not a proper value, it will throw a number format exception, however the decode function will also work for any valid integer (so something base 10 will work as well in this case).
An alternative you could try is:
int value = Integer.parseInt("hex value",16)
However for this method you will need to get rid of the "0x" header from your String
Since you are performing a check, surround it with a try catch
block and whatever is caught would be an improperly formatted hex.
Furthermore if you need to check whether the value is between 0 to 16383, just use the value returned by the methods above.
来源:https://stackoverflow.com/questions/51192896/restricting-a-textfield-input-to-hexadecimal-values-in-java-fx