【问题标题】:DocumentFilter allowing only numbers and period (.) into JTextField?DocumentFilter 只允许将数字和句点 (.) 放入 JTextField?
【发布时间】:2012-08-04 00:55:22
【问题描述】:

\这里是JTextField的创建:

hourlyWageInput = new JTextField("7.25");
DocumentFilter filter = new UppercaseDocumentFilter();
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter);
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER);
add(hourlyWageInput);

这是我的 DocumentFilter:

import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class UppercaseDocumentFilter extends DocumentFilter {

 public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
      String text, javax.swing.text.AttributeSet attr)

      throws BadLocationException {
           fb.insertString(offset, text.replaceAll("\\D", ""), attr);   
 }
}

这会自动从 JTextField 中删除所有字母和字符。

但是,我想知道是否有人知道一个地方有所有类似于“\D”的命令。我花了一段时间才找到正确的信息。

此外,我现在拥有的代码也可以防止 .不是我在使用双打时需要的类型。有什么想法吗?

谢谢!令人惊讶的是我今天学到了很多东西。我已经连续编码了 13 个小时。

【问题讨论】:

  • Google 正则表达式教程。起点:Oracle Regular Expressions Tutorial。我最喜欢的:Regular Expressions Tutorial。从头开始,因为它非常激烈。
  • 你那里有一些时髦的代码。一般你应该调用FilterBypass中的匹配方法,你可能还想覆盖insertString
  • @David Tunnell 非常感谢这个话题

标签: java swing jtextfield replaceall documentfilter


【解决方案1】:

replaceAll 函数接受一个正则表达式。您可以从许多在线教程(参见@Hovercraft Full Of Eels 评论)或直接从Java api 中学习一些关于正则表达式的知识:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

基本上,您可以将任何正则表达式构造(在上面的链接中列出)组合在一起以形成正则表达式。例如,如果您想确保只有 0-9 和 .被允许,你可以使用:

text.replaceAll("[^0-9.]", "")

【讨论】:

  • 我会阅读教程。感谢您提供该程序现在正在运行的所有信息。
  • 我无法为类似问题找到可靠的DocumentFilter 解决方案。我需要输入来遵循正则表达式,但是使用replaceAll() 或类似的(使用Matcher 来累积匹配项并删除不匹配项)是非常不可靠的。 --- 例如,一旦用户在TextComponent 中输入第二个'.',这个答案的解决方案就会变得非常糟糕,因为它破坏了小数一致性。
  • @TheLima - 你的问题略有不同。将其作为自己的问题发布(在此处提供参考)会很有帮助,这样我就可以给您一个完整的答案。但基本上你需要一个更高级的过滤器来检测小数点以前是否被使用过。只需在 DocumentFilter 中放置一个布尔字段,以确定用于验证的正则表达式是否允许句点。
  • @NickRippe - 链接是here。我的问题与小数点一致性相关但不完全相同,但我不知道该怎么做,这可能有助于解决问题。 --- 在此处发布小数点一致性答案作为编辑而不是在此处发布可能是一个更好的主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多