将Javafx文本字段中的十进制输入转换为双精度输入

将Javafx文本字段中的十进制输入转换为双精度输入,java,javafx,Java,Javafx,所以,我对javafx非常陌生,我尝试使用textfield来接收字符串,然后使用try-catch,如果可能的话,将字符串转换为double。我唯一的问题是,如果我输入一个十进制数,比如1000.56,catch会激活,我的错误标签会弹出,说它不能接受字符串。这是相关的代码块,请假设我已经完成了所有正确的导入和变量的所有基本设置 //takes in the users input and trims spaces holder[i] = txt

所以,我对javafx非常陌生,我尝试使用textfield来接收字符串,然后使用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);
                }
            }

由于以下几个原因,您不应该在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();
}

由于以下几个原因,您不应该在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();
}

您是否打印出了
holder[i]
的值,以确保传递给
parseDouble
的实际上是
“1000.56”
?哦,天哪;我觉得自己很愚蠢。我这样做是因为在那个提示之后,另一个提示使用了相同的文本字段,我不小心把清除它的东西放在了开头。你是否打印了
holder[I]
的值,以确保传递给
parseDouble
的实际上是
“1000.56”
?哦,天哪;我觉得自己很愚蠢。我这样做是因为在那个提示之后,另一个提示使用了相同的文本字段,我不小心把清除它的东西放在了开头;我想我应该提到这一点,对不起。谢谢你提供的信息,但是我有一个基于用户按下旁边一个单独按钮的actionEvent;我想我应该提一下,对不起。