当前位置: 首页 > 知识库问答 >
问题:

将Javafx textfield中的十进制输入转换为double

罗和煦
2023-03-14
            //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个答案

穆文斌
2023-03-14

您不应该在JavaFX中执行这样的循环,原因有几个:

  • 这样的循环会阻塞应用程序线程。这将导致循环运行时不处理任何输入。
  • 即使输入没有完成,也要修改文本。考虑用户希望输入-1e3的场景。代码允许此输入的唯一方法是像这样逐步更改文本:“”->“1”->“-1”->“-13”->“-1e3”

最简单的修复方法是检查“提交”数据。或者,监听textfield.text属性,并显示一些无效输入的指示(例如某个图标),但不要在每次更改时都修改文本。

@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();
}
 类似资料:
  • 我需要转换十六进制- 当我运行这个错误实际上是显示我需要的值但我不能得到它 groovy.lang.的方法:静态java.lang.我nteger.parseInt()适用于参数类型:(java.math.大整数,java.lang.整数)值:[28855032353026779507009821653742961358,...]可能的解决方案:parseInt(java.lang.String,

  • 问题内容: 我这里有一个将十进制转换为十六进制的函数,但它以相反的顺序打印。我该如何解决? 问题答案: 如果要自己编写此代码而不是使用内置函数,则可以在打印当前数字之前简单地进行递归调用:

  • 本文向大家介绍如何将十六进制转换为十进制?,包括了如何将十六进制转换为十进制?的使用技巧和注意事项,需要的朋友参考一下 而十六进制数是具有值是16的数字系统中的一个并且它具有唯一的16个码元:0,1,2,3,4,5,6,7,8,9和A,B,C,d,E ,其中A,B,C,D,E和F分别是十进制值10、11、12、13、14和15的单位表示。而十进制系统是最熟悉的号码系统向公众开放。它是10的基数,只

  • 本文向大家介绍如何将十进制转换为十六进制?,包括了如何将十进制转换为十六进制?的使用技巧和注意事项,需要的朋友参考一下 十进制是公众最熟悉的数字系统。它是基数10,只有10个符号-0、1、2、3、4、5、6、7、8和9。而十六进制是计算机或数字系统中最常见的数字系统颜色表示。它是基数16,只有16个符号:0、1、2、3、4、5、6、7、8、9和A,B,C,D,E,F。这些A,B,C,D ,E,F分

  • 我正在尝试将数字从十进制值转换为其IEEE 752形式。例如: 我写了这个方法: 有个问题我解决不了,我再举个例子说清楚。 但是当数字为负数时,例如 我收到以下错误: 这意味着我的代码可以完美地处理正数(包括零),但如果是负数,代码就会崩溃。问题出在哪里? 笔记 我想我可以用这种方式解决我的问题 检查是否有一个字符At(0)等于1 如果是(numero.charAt(0)==1),则删除第一个字符

  • 用户用十六进制或二进制输入一个数字(必须以0x或0b为前缀,如果没有给出错误信息) 我不能用基数,我只是用整数。parseInt(s) 我不知道怎样才能使这个计划奏效。。请帮帮我,我还缺什么?