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

时间:2018-07-05 13:42:40

标签: java javafx hex

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

编辑

这是我的版本:

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

3 个答案:

答案 0 :(得分:4)

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属性获得转换后的值。仅在按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]", ""));
            }
        }
    });

这是您要寻找的吗?