Слушатель JavaFX TextField дает java .lang.IllegalArgumentException: начало должно быть <= конец - PullRequest
0 голосов
/ 02 марта 2020

Итак, я пишу программу 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));
        });
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

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

Я использую "\\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();
    }
}
...