Преобразование десятичного ввода в текстовое поле Javafx в двойной - PullRequest
0 голосов
/ 13 сентября 2018

Итак, я довольно новичок в javafx и пытался использовать текстовое поле, чтобы взять строку, а затем, используя try catch, преобразовать строку в double, если это возможно.Единственная проблема, с которой я столкнулся, заключается в том, что если я введу десятичное число, например 1000.56, активируется catch, и появится мой ярлык с сообщением о том, что он не может принять строку.Это соответствующий блок кода, пожалуйста, предположите, что у меня есть все необходимые операции импорта и все базовые настройки для переменных.

            //takes in the users input and trims spaces
            holder[i] = txtFld.getText().trim();
            while(run == false) {
                try {
                    //attempts to parse the stripped text to a double
                    amt[i] = Double.parseDouble(holder[i]);
                    //allows the loop to break
                    run = true;
                }catch(NumberFormatException ex) {
                    txtFld.setText("");
                    //tells the user about the error
                    grid.add(Err, 0, 3);
                }
            }

1 Ответ

0 голосов
/ 13 сентября 2018

Вы не должны делать подобные циклы в JavaFX по нескольким причинам:

  • Подобный цикл блокирует поток приложения.Это приводит к тому, что во время работы цикла входы не обрабатываются.
  • Вы изменяете текст, даже если ввод не завершен.Рассмотрим сценарий, когда пользователь хочет ввести -1E3.Единственный способ, которым ваш код позволил бы этот ввод, - это поэтапное изменение текста следующим образом: "" -> "1" -> "-1" -> "-13" -> "-1E3"

Самое простое решение - просто проверить "отправку" данных.В качестве альтернативы можно прослушать свойство TextField.text и отобразить некоторые указания на недопустимый ввод (например, значок), но не изменять текст при каждом изменении .

Существует некоторая уже доступная реализация, которая пытаетсяРазбор текста о потере фокуса: TextFormatter:

@Override
public void start(Stage primaryStage) {
    TextField textField = new TextField();

    TextFormatter<Double> formatter = new TextFormatter<>(new DoubleStringConverter(), 0d);
    textField.setTextFormatter(formatter);

    formatter.valueProperty().addListener((o, oldValue, newValue) -> System.out.println("value changed to " + newValue));

    Button button = new Button("some other focusable element");

    Scene scene = new Scene(new VBox(textField, button));
    primaryStage.setScene(scene);
    primaryStage.show();
}

Редактировать

Для кнопок «отправки» просто проверьте значение из обработчика событий:

@Override
public void start(Stage primaryStage) {
    TextField textField = new TextField();
    Label textErrorLabel = new Label();
    textErrorLabel.setTextFill(Color.RED);

    HBox textBox = new HBox(10, textField, textErrorLabel);
    textBox.setPrefWidth(300);

    Button button = new Button("Submit");
    button.setOnAction(evt -> {
        boolean valid = true;
        double value = 0;
        try {
            value = Double.parseDouble(textField.getText());
            textErrorLabel.setText("");
            textField.setStyle(null);
        } catch (NumberFormatException ex) {
            valid = false;
            textErrorLabel.setText("erroneous input");
            textField.setStyle("-fx-control-inner-background: red;");
        }

        // you could do more input validation here...

        if (valid) {
            System.out.println("successfully submitted "+ value);
        }
    });

    Scene scene = new Scene(new VBox(textBox, button));
    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...