JavaFX TextField 侦听器给出 java.lang.IllegalArgumentException:开始必须 <= 结束

JavaFX TextField listener gives java.lang.IllegalArgumentException: The start must be <= the end

所以我正在编写一个 javafx 程序来操作一个字节中的各个位。每个位都有一个文本字段。我想在文本字段上实现一个 changelistener,所以除了 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));
        });
    }
}

使用与副本相同的想法。您需要定义一个匹配二进制数的正则表达式。

我正在使用 "\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();
    }
}