我如何可以限制用户仅十六进制值输入?用十进制表示的范围是从0到16383,但我想让用户键入一个十六进制数成TextField
。因此范围应是0x0000到0x3FFF。我已经建立了通过SceneBuilder
我的GUI,所以我只需要一个函数来处理用户的输入限制和转换。
编辑
这是我的版本:
startAddressField.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.matches("^[0-9A-F]?")) {
startAddressField.setText(oldValue);
}
});
使用带有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
失去焦点。
做到这一点最好的办法是使用正则表达式:
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]", ""));
}
}
});
这是什么您正在寻找?
一个想法可能是它第一次解析成整数格式。您可以使用:
int value = Integer.decode("your hex value here");
如果字符串是不是一个合适的值,它会抛出一个数字格式例外,但是解码功能也将适用于任何有效的整数(这样的东西基地10将在这种情况下工作,以及)。
你可以尝试另一种方法是:
int value = Integer.parseInt("hex value",16)
然而,对于这种方法,你将需要从你的字符串摆脱“0X”头的
既然你是执行检查,围绕着它与try catch
块和任何被捕获将是一个格式不正确的十六进制。
此外,如果你需要检查值是否为16383 0之间,只要使用由上述方法的返回值。