Ограничение ввода TextField шестнадцатеричными значениями в Java FX - PullRequest
0 голосов
/ 05 июля 2018

Как я могу ограничить ввод от пользователя только шестнадцатеричными значениями? С десятичной нотацией диапазон составляет от 0 до 16383, но я хотел бы позволить пользователю ввести шестнадцатеричное число в TextField. Поэтому диапазон должен быть от 0x0000 до 0x3FFF . Я уже построил свой графический интерфейс через SceneBuilder, поэтому мне просто нужна функция для обработки ограничений и преобразования при вводе пользователем.

EDIT

Это моя версия:

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

Ответы [ 3 ]

0 голосов
/ 05 июля 2018


лучший способ сделать это с помощью регулярных выражений:

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

Это то, что вы ищете?

0 голосов
/ 05 июля 2018

Используйте 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. Обновляется только при нажатии клавиши ввода или при потере фокуса TextField.

0 голосов
/ 05 июля 2018

Идея может состоять в том, чтобы сначала разобрать его в целочисленный формат. Вы можете использовать:

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

если строка не является правильным значением, она выдаст исключение формата чисел, однако функция декодирования также будет работать для любого допустимого целого числа (так что в этом случае будет работать что-то базовое 10).

Альтернатива, которую вы можете попробовать:

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

Однако для этого метода вам нужно избавиться от заголовка "0x" из вашей строки

Поскольку вы выполняете проверку, окружите ее блоком try catch, и все, что будет обнаружено, будет неправильно отформатированным гексом.

Кроме того, если вам нужно проверить, находится ли значение в диапазоне от 0 до 16383, просто используйте значение, возвращенное вышеуказанными методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...