gpt4 book ai didi

java - 将 Javafx 文本字段中的十进制输入转换为 double

转载 作者:行者123 更新时间:2023-12-02 01:55:46 25 4
gpt4 key购买 nike

所以,我对 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);
}
}

最佳答案

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

关于java - 将 Javafx 文本字段中的十进制输入转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com