限制一个文本字段输入十六进制值在Java中FX

问题描述 投票:2回答:3

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

编辑

这是我的版本:

startAddressField.textProperty().addListener((observable, oldValue, newValue) -> {
        if (!newValue.matches("^[0-9A-F]?")) {
            startAddressField.setText(oldValue);
        }
    });
java javafx hex
3个回答
4
投票

使用带有TextFormatterUnaryOperator一个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
投票

做到这一点最好的办法是使用正则表达式:

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

这是什么您正在寻找?


1
投票

一个想法可能是它第一次解析成整数格式。您可以使用:

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

如果字符串是不是一个合适的值,它会抛出一个数字格式例外,但是解码功能也将适用于任何有效的整数(这样的东西基地10将在这种情况下工作,以及)。

你可以尝试另一种方法是:

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

然而,对于这种方法,你将需要从你的字符串摆脱“0X”头的

既然你是执行检查,围绕着它与try catch块和任何被捕获将是一个格式不正确的十六进制。

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

© www.soinside.com 2019 - 2024. All rights reserved.