Java 当按下不是数字的键时,如何正确使用此事件?

Java 当按下不是数字的键时,如何正确使用此事件?,java,validation,javafx,Java,Validation,Javafx,我一直在为我的公司开发一个小应用程序,但我是自学成才,使用YouTube和谷歌。我试图在按下非号码时使用numberValidationEvent,以便只允许按电话号码 相反,它总是以非数字形式读取。我能得到帮助吗?我希望事件忽略任何不是数字0-9的内容 private boolean isNumber; private String callbackNumber; @Override public void start(Stage primaryStage) { /*

我一直在为我的公司开发一个小应用程序,但我是自学成才,使用YouTube和谷歌。我试图在按下非号码时使用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;
    }

 }

我建议以不同的方式检查文本的值。将结果建立在抛出异常的基础上并不理想

另外,在将来,包含所有做这项工作的代码也是很有帮助的

我建议检查字符串消息是否只包含数字。我不知道你为什么要把它转换成长的来检查它。假设您在运行consume时使用了那么长的时间,我将把它保留在我的示例中

此外,如果在isLong中未使用TextField对象,则应删除该对象

最后,返回一个不使用的布尔值,并在方法中设置一个布尔值,这是多余的。让我们清理一下

替换isLongTextField tf的代码,下面是字符串m

如果您不需要callBackNumberLong作为Long,我建议不要解析它并将其保留为字符串。我感觉你不会用电话号码做数学题


剩下要做的就是调用isLongmessage,检查isNumber是否为true,而不是调用isLongtf,m然后检查后面的布尔值。

我希望事件忽略任何不是数字0-9的内容是什么意思?这是否意味着它应该只允许文本字段中的数字?为什么要传递文本字段输入?您没有在isLong方法中使用它?您可以尝试修剪txtfCallbackNumber.getText,然后将其传递给Long.parseLong。我在我的机器上运行了您的代码,用于各种输入,它似乎工作正常!虽然use-key-event可以工作,但是javafxapi确实提供了这样的过滤功能。看一看和。别忘了阅读教程,f.i。标签信息中引用的介绍性ui教程。这些YouTube似乎传播了最坏的做法-你从来没有在键盘手柄中进行过任何输入验证谢谢!很抱歉代码太乱了,我这周才开始学习编程,我的大部分代码都来自youtube视频,所以我没有意识到我所有的错误。这是一个很好的回答。1.我不知道如何引用来自isLong的消息,所以谢谢!这就是为什么我做了一个布尔值来存储在2之外。我不知道你能做什么。匹配[0-9]+如果你用谷歌搜索如何在JavaFX中创建一个数字字段,不会出现很多简单的答案。。。。谢谢这是一个很好的开始。坚持下去。这个引用是一个regex值,我相信它是为了记住它的名字。它们对于检查字符串上的内容非常有用。还有其他的变体,您也可以用于解决其他问题。享受另外,我最后不得不添加一个长度检查,因为当textfield为空时,它立即返回false,并且无法继续,这就是为什么我感到如此困惑的原因。再次感谢!代码很好,但是您可以考虑在文本格式器中使用它是这样的:
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;
    }
}