Слушатель JavaFX TextField выдает java.lang.IllegalArgumentException: начало должно быть ‹= конец

Итак, я пишу программу javafx для управления отдельными битами в байте. У меня есть текстовое поле для каждого бита. Я хочу реализовать прослушиватель изменений в текстовых полях, чтобы нельзя было вводить ничего, кроме 0 или 1. Он отлично работает, если поле пусто, и пользователь пытается ввести букву, но если в нем уже есть 0 или 1, он выдает исключение, и я не понимаю, почему.

Вот мой код:

public class Task03Controller implements Initializable {
    @FXML private TextField zeroTextField, oneTextField, twoTextField, threeTextField,
                            fourTextField, fiveTextField, sixTextField, sevenTextField;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        zeroTextField.textProperty().addListener((observable, oldValue, newValue) -> {
            if(!zeroTextField.getText().equals("0") && !zeroTextField.getText().equals("1"))
                zeroTextField.clear();
           else if(zeroTextField.getText().length() > 1)
               zeroTextField.setText(zeroTextField.getText().substring(0, 0));
        });
    }
}

person bartman1912    schedule 02.03.2020    source источник
comment
Вы должны использовать TextFormatter. stackoverflow.com/questions/40472668/   -  person Sedrick    schedule 02.03.2020
comment
Я относительно новичок в этом, так как же мне здесь использовать TextFormatter? Не могли бы вы привести пример для моего случая? Код в вашем ответе выглядит слишком сложным   -  person bartman1912    schedule 02.03.2020
comment
Отвечает ли это на ваш вопрос? Числовое текстовое поле для целых чисел в JavaFX 8 с TextFormatter и/или UnaryOperator   -  person Sedrick    schedule 02.03.2020
comment
@Sedrick Да, решил, спасибо!   -  person bartman1912    schedule 02.03.2020


Ответы (1)


Используя ту же идею, что и дубликат. Вам нужно определить регулярное выражение, которое соответствует двоичным числам.

Я использую "\\b[01]+\\b" для определения двоичных чисел и "" для определения пустого TextField.

MCVE

import java.util.function.UnaryOperator;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TestingGroundsTwo extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        UnaryOperator<Change> binaryFilter = change -> {
            String newText = change.getControlNewText();
            if (newText.matches("\\b[01]+\\b") || newText.matches("")) {
                return change;
            }
            return null;
        };
        TextField textField = new TextField();
        textField.setTextFormatter(new TextFormatter<>(binaryFilter));

        stage.setTitle("Hello World!");
        Scene scene = new Scene(new StackPane(textField), 750, 125);
        scene.setFill(Color.GHOSTWHITE);
        stage.setScene(scene);
        stage.show();
    }
}
person Sedrick    schedule 02.03.2020
comment
Да, пришло почти такое же решение, но я использовал (newText.matches([0-1]*)) для разрешения только пустого поля, 0 или 1 - person bartman1912; 02.03.2020
comment
@ bartman1912 Это позволит любое число от 0 до 1; если вам нужен только ноль или одна цифра (что, я думаю, является намерением), используйте "[01]?" в качестве регулярного выражения. - person James_D; 02.03.2020