【问题标题】:How to use JFormattedTextField to allow only alphabets?如何使用 JFormattedTextField 只允许字母?
【发布时间】:2015-06-06 08:50:42
【问题描述】:

我到处寻找解决方案,但我找到的解决方案只允许使用数字、字母数字(使用DocumentFilter)。

但是,我只需要允许使用字母,并且由于一些优势,我打算使用JFormattedTextField

那么,如何使用JFormattedTextField 只允许使用字母(a-zA-Z)(没有空格、标点、字母)!

【问题讨论】:

  • JFormattedTextField 是否能够接收可变数量的字母?还是一个固定的数字?
  • 可变数量的字母!

标签: java jtextfield jformattedtextfield


【解决方案1】:

由于数字是可变的,如果我没记错的话,JFormattedTextField 使用掩码来表示固定长度的数字,将更容易使用 litener 来更改文本事件并验证元素中的文本删除不允许的字符。

类似的东西:

JTextField f = null;

f.getDocument().addDocumentListener(new DocumentListener()
{
  @Override
  public void insertUpdate(DocumentEvent e)
  {
    validateInputText();
  }

  @Override
  public void removeUpdate(DocumentEvent e)
  {
    validateInputText();
  }

  @Override
  public void changedUpdate(DocumentEvent e)
  {
    validateInputText();
  }
});

【讨论】:

  • 如果我复制一些包含数字、空格的文本并将其粘贴到字段中会怎样。在这种情况下,这将不起作用。
  • 更新了我的答案来解决这个问题。现在,当文本更改与更改方式无关时,您会收到通知,因此您可以处理所需的所有验证。
  • 是的,但是如果数据已经更新了,还有什么用。 DocumentListener 方法在文档更新后被触发。
  • 是的,然后你删除你不想要的数据
  • 这是可能的,但工作量太大,不会是最好的解决方案。正如我提到的需要使用JFormattedTextField 功能。
【解决方案2】:

在尝试了很多解决方案之后,我认为最好的解决方案是扩展DocumentFilter类。

代码如下:

class AlphabetFilter extends DocumentFilter {

    @Override
    public void insertString(FilterBypass fb, int offset, String string,
            AttributeSet attr) throws BadLocationException {
        super.insertString(fb, offset, string.replaceAll("[^A-Za-z]+", ""), attr);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length,
            String string, AttributeSet attr) throws BadLocationException {
        super.replace(fb, offset, length, string.replaceAll("[^A-Za-z]+", ""), attr);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多