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

我有一个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"); 不起作用

设定价值的正确方法是什么?

相当奇怪,但这出现在另一个问题(在Java:网络设置窗口 )。 经过挖掘后,Sun推出了RegexFormatter实现(请参阅http://java.sun.com/products/jfc/tsc/articles/reftf/ ;在http://java.sun.com/下载源代码products / jfc / tsc / articles / reftf / RegexFormatter.java )你可以这样使用:

 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"); 

你可能已经离开了这里,但我想我会坚持这一点以防其他人徘徊。

空格不算数字(#)和。 算作任何东西。 遗憾的是,除非你能找到一种方法为1个JFormattedTextField提供多个MaskFormatters,否则你无法将一个IP地址与MaskFormatter匹配。

简单

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

编辑:你必须使用常规的JTextField并validation它

我已经尝试使用掩码格式化器,但它对我们的情况并不好,所以我想出了这个方法使用Regex和用户输入的即时validation。

此代码使用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); } }); 

在每个字段更新中,输入将使用匹配器进行validation:

 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); } }