我一直在为我的公司开发一个小应用程序,但我使用YouTube和Google自学。我在按下非数字时尝试使用numberValidationEvent,只允许按下数字(电话号码)。
相反,它总是作为非数字阅读。我可以得到帮助吗?我希望事件忽略任何不是数字(0-9)
的事件 private boolean isNumber;
private String callbackNumber;
@Override
public void start(Stage primaryStage) {
/*
SOME CODE
*/
// CALLBACK NUMBER
Label lblCallbackNumber = new Label("Callback Number:");
GridPane.setConstraints(lblCallbackNumber, 0, 1);
TextField txtfCallbackNumber = new TextField();
txtfCallbackNumber.setPromptText("1234567890");
GridPane.setConstraints(txtfCallbackNumber, 1, 1);
txtfCallbackNumber.setOnKeyTyped(numberValidationEvent -> {
isLong(txtfCallbackNumber, txtfCallbackNumber.getText());
if(!isNumber) {
numberValidationEvent.consume();
}
});
/*
SOME CODE
*/
}
private boolean isLong(TextField input, String message){
try {
long callbackNumberLong = Long.parseLong(message);
isNumber = true;
System.out.println("That was a number!");
return true;
} catch (NumberFormatException e) {
System.out.println("That was NOT a number!");
isNumber = false;
return false;
}
}
答案 0 :(得分:1)
我建议以不同方式检查文本的值。将结果建立在抛出异常的基础上并不理想。
此外,将来包含完成工作的所有代码也很有帮助。
我建议检查字符串message
是否只包含数字。我不确定您为什么要将其转换为Long
来检查。假设您在运行consume()
时使用的时间很长,我会将其保留在我的示例中。
此外,您没有在isLong
中使用TextField对象,您应该删除它。
最后,通过返回一个你没有使用的布尔值并在方法中设置一个布尔值,你是多余的。让我们清理一下。
替换isLong(TextField tf, String m)
的代码低于
private boolean isLong(String message){
if (message.matches("[0-9]+")) {
try {
long callbackNumberLong = Long.parseLong(message);
System.out.println("That was a number!");
return true;
} catch (NumberFormatException e) {
System.out.println("That was NOT a number!");
return false;
}
} else {
return false;
}
}
如果你不需要callBackNumberLong作为Long,我建议不要解析它并将其保存为字符串。我有一种感觉,你不会用电话号码做数学。
剩下要做的就是调用isLong(message)
,检查isNumber
是否为真,而不是调用isLong(tf, m)
,然后检查布尔值。