【问题标题】:Restricting a TextField input to hexadecimal values in Java FX在 Java FX 中将 TextField 输入限制为十六进制值
【发布时间】:2026-02-07 18:45:01
【问题描述】:

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

编辑

这是我的版本:

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

【问题讨论】:

  • 你已经尝试了什么?以这种方式发布您的代码,我们可以帮助您找出哪里出错了。您可以在字段上设置一个 TextFormatter 来监控和限制输入。
  • 提示:您可能需要现场的客户编辑器

标签: java javafx hex


【解决方案1】:

TextFormatterUnaryOperatorStringConverter<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 属性获得。它只会在按下回车键或 TextField 失去焦点时更新。

【讨论】:

  • 谢谢,我正在尝试您的解决方案,它似乎运作良好。但是我遇到一个错误:如何克服"[0-3]?\p{XDigit}{0,3}" 中的非法转义字符?我正在尝试使用双反斜杠!
【解决方案2】:


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

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]", ""));
            }
        }
    });

这是你要找的吗?

【讨论】:

  • 感谢您的回答,我也做过类似的事情,您可以在编辑中看到。但是,我正在考虑一种实现范围限制和Integer 转换的方法。
  • 您应该使用非十六进制值,而不仅仅是非数字值(顺便说一句,\D 可以使用)。否则3AC! 会导致3 而不是3AC
  • 不,不要听和回复 - 而是使用 @f* 在他接受的 (!) 答案中解释的 TextFormatter
【解决方案3】:

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

int value = Integer.decode("your hex value here");

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

您可以尝试的替代方法是:

int value = Integer.parseInt("hex value",16)

但是对于这种方法,您需要从字符串中删除“0x”标头

由于您正在执行检查,因此用try catch 块包围它,捕获的内容将是格式不正确的十六进制。

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

【讨论】:

    最近更新 更多