在Java FX中将TextField输入限制为十六进制值

在Java FX中将TextField输入限制为十六进制值,java,javafx,hex,Java,Javafx,Hex,如何将用户的输入限制为仅十六进制值? 使用十进制表示法,范围是从0到16383,但我想让用户在TextField中键入十六进制数字。因此,范围应为0x0000到0x3FFF。我已经通过SceneBuilder构建了GUI,因此我只需要一个函数来处理对用户输入的限制和转换 编辑 这是我的版本: startAddressField.textProperty().addListener((observable, oldValue, newValue) -> { if (!newV

如何将用户的输入限制为仅十六进制值? 使用十进制表示法,范围是从0到16383,但我想让用户在
TextField
中键入十六进制数字。因此,范围应为0x0000到0x3FFF。我已经通过
SceneBuilder
构建了GUI,因此我只需要一个函数来处理对用户输入的限制和转换

编辑

这是我的版本:

startAddressField.textProperty().addListener((observable, oldValue, newValue) -> {
        if (!newValue.matches("^[0-9A-F]?")) {
            startAddressField.setText(oldValue);
        }
    });

一个想法可能是首先将其解析为整数格式。您可以使用:

int value=Integer.decode(“这里是您的十六进制值”)

如果字符串不是一个正确的值,它将抛出一个数字格式异常,但是decode函数也将适用于任何有效的整数(因此在这种情况下,以10为基数的函数也适用)

您可以尝试的另一种选择是:

int-value=Integer.parseInt(“十六进制值”,16)

但是,对于这个方法,您需要从字符串中去掉“0x”头

因为您正在执行检查,所以用
try catch
块将其包围,捕获的任何内容都将是格式不正确的十六进制

此外,如果需要检查值是否在0到16383之间,只需使用上述方法返回的值。


最好的方法是使用正则表达式:

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]", ""));
            }
        }
    });
yourTextField.textProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue使用
TextFormatter
UnaryOperator
StringConverter
,如下所示:

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);
unarymoperator filter=change->change.getControlNewText().matches(“[0-3]”?\\p{XDigit}{0,3}”)?更改:null;
StringConverter转换器=新的StringConverter(){
@凌驾
公共字符串到字符串(整数对象){
返回对象==null?“:Integer.toHexString(对象);
}
@凌驾
公共整数fromString(String字符串){
返回字符串==null | | string.isEmpty()?null:Integer.parseInt(字符串,16);
}
};
TextFormatter formatter=新的TextFormatter(转换器、null、过滤器);
setTextFormatter(格式化程序);

转换后的值可通过
TextFormatter.value
属性获得。它仅在按enter键或
TextField
失去焦点时更新。

您已经尝试了什么?发布您的代码,这样我们可以帮助您找出错误所在。您可以在字段上设置TextFormatter以监视和限制输入.提示:您可能需要一个客户编辑器。谢谢您的回答,我也做了类似的事情,您可以在编辑中看到。但是,我正在考虑一种实现范围限制和
整数
转换的方法。您应该使用非十六进制值,而不仅仅是非数字值(对于那些
\D
可以使用btw)。否则
3AC!
会导致
3
不在
3AC
中。不,不要听录音并还原-而是使用@fabian在其接受的(!)中解释的文本格式化程序答:谢谢,我正在尝试你的解决方案,看起来效果不错。但是我遇到了一个错误:如何克服
“[0-3]”中的非法转义字符?\p{XDigit}{0,3}”
?我正在尝试使用双反斜杠!