Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用占位符字符设置JFormattedTextField的值?_Java - Fatal编程技术网

Java 如何使用占位符字符设置JFormattedTextField的值?

Java 如何使用占位符字符设置JFormattedTextField的值?,java,Java,我有一个ip地址的格式化文本字段: ipmask = new MaskFormatter("###.###.###.###"); ipmask.setPlaceholderCharacter(' '); field = new JFormattedTextField(ipmask); field.setValue(“111.222.333.444”)有效,但是 field.setValue(“10.222.333.444”)不起作用 field.setValue(“10.222.333.444

我有一个ip地址的格式化文本字段:

ipmask = new MaskFormatter("###.###.###.###");
ipmask.setPlaceholderCharacter(' ');
field = new JFormattedTextField(ipmask);
field.setValue(“111.222.333.444”)有效,但是

field.setValue(“10.222.333.444”)不起作用

field.setValue(“10.222.333.444”)不起作用

field.setValue(“10.222.333.444”)不起作用


设置该值的正确方法是什么?

空格不算作数字(#)和。算什么。不幸的是,您无法将IP地址与MaskFormatter匹配,除非您能找到一种方法为1 JFormattedTextField使用多个MaskFormatter

简单的

if (field.getValue().matches("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")) //do something

编辑:你必须使用一个常规的JTextField并验证它,这很奇怪,但这在另一个问题中出现了。仔细研究后发现,Sun提供了一个RegexFormatter实现(请参阅;在下载源代码),您可以这样使用它:

JFormattedTextField ipAddress;
   try{
    RegexFormatter ipmask = new RegexFormatter("\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}");
        ipmask.setOverwriteMode(false);
    ipAddress = new JFormattedTextField(ipmask);
}catch(Exception e1){
}
ipAddress.setValue("255.255.255.255");

你可能已经离开这里了,但我想我会把它放在这里,以防其他人走失。

我尝试过使用掩码格式化程序,但它不适合我们这里的情况,所以我提出了使用正则表达式和即时验证用户输入的方法

此代码是使用gui builder生成的:

jFormattedTextField2 = new javax.swing.JFormattedTextField();
jFormattedTextField2.setHorizontalAlignment(jFormattedTextField2.CENTER);
jFormattedTextField2.addCaretListener(new javax.swing.event.CaretListener() {
    public void caretUpdate(javax.swing.event.CaretEvent evt) {
        jFormattedTextField2CaretUpdate(evt);
    }
});
在每次字段更新时,将使用matcher验证输入:

private void jFormattedTextField2CaretUpdate(javax.swing.event.CaretEvent evt) {                                                 
        // validation happen here and the text is red if IP is invalid
        final String regex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
        final Pattern pattern = Pattern.compile(regex);
        String ip = jFormattedTextField2.getText();
        Matcher m = pattern.matcher(ip);
        jFormattedTextField2.setForeground(Color.red);
        if (m.matches()) {
            jFormattedTextField2.setForeground(Color.black);
        }
    }

显然,占位符字符只能在字符串末尾使用。我找不到解决这个问题的方法,我正在删除我的错误答案。我知道我可以编写自己的类来完成这项工作,但最好是内置java类来完成这项工作。