JavaFX TextField侦听器提供java.lang.IllegalArgumentException:开头必须为<=结尾

问题描述 投票:0回答:1

所以我正在编写一个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));
        });
    }
}
javafx textfield illegalstateexception changelistener
1个回答
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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.