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