当前位置: 首页 > 知识库问答 >
问题:

javafx文本字段ip地址

龙高超
2023-03-14

我想确保用户在JavaFX TextField(0.0.0.0255.255.255.255)中输入有效的IPv4地址,但我似乎找不到任何有效的解决方案。

我尝试了该代码:

    private final TextField serverURI = new TextField();
    final UnaryOperator<TextFormatter.Change> urlFilter = new UnaryOperator<TextFormatter.Change>() {
        @Override
        public TextFormatter.Change apply(TextFormatter.Change change) {
            final String text = change.getText();
            return (text.isEmpty() || text.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")) ? change : null;
        }
    };
    final TextFormatter<String> urlFormatter = new TextFormatter(urlFilter);
    serverURI.setTextFormatter(urlFormatter);

但是我连一个数字都打不出来...它似乎只用一个输入就可以工作

共有2个答案

荣曾笑
2023-03-14

您可以手动检查数字。

private static boolean checkIfValidIpv4(String text){
   StringTokenizer st = new StringTokenizer(text,".");
   for(int i = 0; i < 4; i++){ 
     if(!st.hasMoreTokens()){
       return false;
     }
     int num = Integer.parseInt(st.nextToken());
     if(num < 0 || num > 255){
       return false;
    }
   }
   if(st.hasMoreTokens()){
     return false;
   }
   return true;
}

虽然不雅致,但很管用。

龙俊德
2023-03-14

这些都很棘手。

第一个注意事项是,您正在使用更改。getText(),提供要添加或删除的文本;您希望测试结果文本(即添加或删除后的文本)。为此,请使用更改。getControlNewText()。

例如,如果文本字段中的当前文本为255.2,并且用户键入了a,则更改。getText()将返回“5”,而将更改。getControlNewText()将返回“255.25”。

这仍然留下了一个主要问题,即过滤器将应用于文本的每个单独更改,并且您正在测试完整的ip地址。因此,例如,要键入“255.255.255.255”,用户将首先键入“2”。您测试(即使使用change.getControlNewText())如果“2”与正则表达式匹配,它将失败(因为它不是一个完整的IP地址),因此更改被否决。在下一个键入的键上,更改。getControlNewText()将为“25”,依此类推。因此,您需要整个序列“2”、“25”、“255”、“255”、“255.2”等,以通过过滤器。您还需要过滤器来接受用户删除字符、复制和粘贴等操作。

所以你真的需要一个regex来测试部分条目,而不是完整条目,这当然有点棘手。下面是一个例子,不是为了防弹,但至少应该让你走上正确的道路。请注意,当用户提交值时,您可能需要进行额外的验证,以检查您是否拥有完整、有效的ip地址。

import java.util.function.UnaryOperator;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class IPTextFieldTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextField ipTextField = new TextField();
        String regex = makePartialIPRegex();
        final UnaryOperator<Change> ipAddressFilter = c -> {
            String text = c.getControlNewText();
            if  (text.matches(regex)) {
                return c ;
            } else {
                return null ;
            }
        };
        ipTextField.setTextFormatter(new TextFormatter<>(ipAddressFilter));
        StackPane root = new StackPane(ipTextField);
        Scene scene = new Scene(root, 350, 120);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private String makePartialIPRegex() {
        String partialBlock = "(([01]?[0-9]{0,2})|(2[0-4][0-9])|(25[0-5]))" ;
        String subsequentPartialBlock = "(\\."+partialBlock+")" ;
        String ipAddress = partialBlock+"?"+subsequentPartialBlock+"{0,3}";
        return "^"+ipAddress ;
    }


    public static void main(String[] args) {
        launch(args);
    }
}

 类似资料:
  • 我正在从事一个JavaFX 2.2项目,在使用TextField控件时遇到问题。我想限制用户可以在每个文本字段中输入的字符数。但是,我找不到属性或类似maxlength的东西。Swing中也存在同样的问题,通过这种方式解决了。JavaFX 2.2如何解决这个问题?

  • 我需要一些帮助。我有一个s的。 我想检查值是否发生了变化。如果是,我想知道它是哪个文本字段。我知道我可以使用侦听器来执行此操作,但这只适用于单个侦听器。 我希望它在数组上工作并确定哪个文本字段已更改。 提前感谢!

  • 我的代码中有JavaFX文本字段,希望在文本字段上为不同的事件添加一个操作。 今天,我只在文本字段中写入一些文本后按enter键时得到一个操作。如何添加处理tab press的操作?还有,当文本字段用鼠标点击失去焦点时,该如何反应? 当我读留档应该是可能的:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextFi

  • 问题内容: 我正在使用JavaFX和Scene Builder,并且有一个带有文本字段的表单。这些文本字段中的三个从字符串解析为双精度。 我希望它们是学校成绩,因此只能将其设置为1.0到6.0之间。不应允许用户写“ 2.34.4”之类的内容,但可以写“ 5.5”或“ 2.9”之类的内容。 验证已解析字段: 如何测试用户输入的值是否正确? 我已经在Stackoverflow和Google上进行了搜索

  • 我使用的是javafx文本字段。我需要输入与格式##########匹配的数字和小数### 小数不可编辑,数字可以是任意数字;不允许其他输入。并非所有数字占位符都需要填写,例如,它可能是1.2或2.22.1,甚至是1.222.222.0 我尝试使用模式匹配与正则表达式来验证更改的文本,但仅此而已;它验证输入,它不会使十进制字段成为不可编辑的字段,并且工具提示不是一个选项。我不确定还能尝试什么。 我

  • 我在寻找一种方法来放弃我的程序中的一个getter。我有一堆动态创建的文本字段: 下面是getter,我想在这里返回聚焦的TextField 处理程序将接收聚焦字段并调用我的“model”-class中的checkInput()方法。 此刻,它接收到一个由我自己设置的预定义字段。检查答案的代码有效。感谢任何帮助我的人,如果我自己找到了一个方法,我一定会把它贴在这里。