如何将用户的输入限制为仅十六进制值?
使用十进制表示法时,范围是从0到16383,但是我想让用户在TextField
中输入一个十六进制数。因此,范围应从 0x0000 到 0x3FFF 。我已经通过SceneBuilder
构建了我的GUI,因此我只需要一个函数来处理对用户输入的限制和转换。
编辑
这是我的版本:
startAddressField.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.matches("^[0-9A-F]?")) {
startAddressField.setText(oldValue);
}
});
答案 0 :(得分:4)
将TextFormatter
与UnaryOperator
和StringConverter<Integer>
一起使用,如下所示:
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);
可通过TextFormatter.value
属性获得转换后的值。仅在按Enter或TextField
失去焦点时才会更新。
答案 1 :(得分:1)
一个想法可能是先将其解析为整数格式。您可以使用:
int value = Integer.decode("your hex value here");
如果字符串不是一个适当的值,它将抛出数字格式异常,但是解码功能也将对任何有效的整数起作用(因此在这种情况下,以10为底的数字也将起作用)。
您可以尝试的替代方法是:
int value = Integer.parseInt("hex value",16)
但是,对于这种方法,您将需要摆脱String中的“ 0x”标头
由于您正在执行检查,因此请用try catch
块将其包围,发现的内容将是格式不正确的十六进制。
此外,如果您需要检查该值是否在0到16383之间,则只需使用上述方法返回的值即可。
答案 2 :(得分:1)
最好的方法是使用正则表达式:
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]", ""));
}
}
});
这是您要寻找的吗?