如果按下的键不是数字,我该如何正确使用此事件?

时间:2018-04-13 04:25:28

标签: java validation javafx

我一直在为我的公司开发一个小应用程序,但我使用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;
    }

 }

1 个答案:

答案 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),然后检查布尔值。