JTextField 中没有空格

Posted

技术标签:

【中文标题】JTextField 中没有空格【英文标题】:No blanks in JTextField 【发布时间】:2010-10-18 01:41:45 【问题描述】:

如何禁止用户在 JTextField 中输入空格? 甚至应该不能写空格。

【问题讨论】:

【参考方案1】:

我建议使用扩展的 PlainDocument 设置 JTextField 的 Document,您可以在其中覆盖 insertString 方法。 (也很高兴限制大小...) 比如:

Document doc = new PlainDocument() 
    @Override
    public void insertString(int offs, String str, AttributeSet attr)
    throws BadLocationException 
        String newstr = str.replaceAll(" ", "");  // could use "\\s" instead of " "
        super.insertString(offs, newstr, attr);
    

    @Override
    public void replace(int offs, int len, String str, AttributeSet attr) 
    throws BadLocationException 
        String newstr = str.replaceAll(" ", "");  // could use "\\s" instead of " "
        super.replace(offs, len, newstr, attr);
    
;
textField.setDocument(doc);

编辑:replace 也必须被覆盖/实现!

【讨论】:

DocumentFilter 是最好的。除了 insertString 之外,还有其他插入文本的方法。 @Tom:是的,我没见过。一种更好的“过滤”方式(我现在知道了)! 很好,但我也必须实现replaceString,因为 JTextField 似乎从未使用过 insertString! @lapo 我认为是另一种方式 - 在这里(Java 7,Windows XP)只有insertString() 被调用,而不是replaceString(),至少在使用键盘和复制粘贴时不会......无论如何我会覆盖两者,但我认为使用DocumentFilter 的解决方案更合适,请参阅汤姆的回答 我认为过滤器也更好,但它似乎只被称为散焦,而不是逐个字母,我想要避免写一些字母.【参考方案2】:

您可以使用键盘映射。查看this example 禁止空格将如下所示:

KeyStroke keyStroke = KeyStroke.getKeyStroke(Character.valueOf(' '), 0);
textField.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "none");

【讨论】:

【参考方案3】:

解决此问题的最佳方法可能是使用DocumentDocumentFilter,以删除任何键入、粘贴或以其他方式插入的空格。 (编辑:这个问题最初链接到一个关于演示这种技术的小型 Swing 程序的博客条目(在这种情况下只允许整数输入)。)

扩展Document 的子类型是可能的,但更容易出错(并将您与特定的实现联系在一起)。

试图拦截按键实际上不起作用(它处于错误的抽象级别,因此错过了您可以插入文本的任何其他方式,例如粘贴、dnd 等)。

JFormattedTextField 是确保任何 UI 都浪费时间的好方法。

【讨论】:

以上是关于JTextField 中没有空格的主要内容,如果未能解决你的问题,请参考以下文章

多个 JTextfield 的空字符串验证

Java Swing:JTextField 没有按预期失去焦点

有没有办法只接受 JTextField 中的数值?

在 JTextField 的值中显示查询结果

在 jTextfield 中禁用“粘贴”

JAVA中如何判断JTextField的一些问题?求高手解答……谢谢