当前位置: 首页 > 知识库问答 >
问题:

过滤JTextField中的字符串、空格和点(.)使用文档过滤器

公冶子琪
2023-03-14

我有一个JTexTField,我希望用户输入一个人的姓名。我认为名称应该包含[a-zA-Z]space示例Bill先生。我正在使用DocumentFilter来验证用户输入。但是,我不知道如何在我的DocumentFilter中设置它。

问题:我应该如何修改我的过滤器来实现上述行为?

任何关于如何验证一个人的名字的建议都被接受。

这是我的DocumentFilter:

public class NameValidator extends DocumentFilter{
@Override
public void insertString(DocumentFilter.FilterBypass fp, int offset,
        String string, AttributeSet aset) throws BadLocationException {
    int len = string.length();
    boolean isValidInteger = true;

    for (int i = 0; i < len; i++) {
        if (!Character.isLetter(string.charAt(i))) {
            isValidInteger = false;
            break;
        }
    }
    if (isValidInteger)
        super.insertString(fp, offset, string, aset);
    else {
        JOptionPane.showMessageDialog(null,
                "Please Valid Letters only.", "Invalid Input : ",
                JOptionPane.ERROR_MESSAGE);
        Toolkit.getDefaultToolkit().beep();
    }
}

@Override
public void replace(DocumentFilter.FilterBypass fp, int offset, int length,
        String string, AttributeSet aset) throws BadLocationException {
    int len = string.length();
    boolean isValidInteger = true;

    for (int i = 0; i < len; i++) {
        if (!Character.isLetter(string.charAt(i)) ) {
            isValidInteger = false;
            break;
        }
    }
    if (isValidInteger)
        super.replace(fp, offset, length, string, aset);
    else {
        JOptionPane.showMessageDialog(null,
                "Please Valid Letters only.", "Invalid Input : ",
                JOptionPane.ERROR_MESSAGE);
        Toolkit.getDefaultToolkit().beep();
     }
   }
 }

这是我的测试类:

public class NameTest {

private JFrame frame;

public NameTest() {
    frame = new JFrame();
    initGui();
}

private void initGui() {

    frame.setSize(100, 100);
    frame.setVisible(true);
    frame.setLayout(new GridLayout(2, 1, 5, 5));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextField name = new JTextField(15);
    ((AbstractDocument) name.getDocument())
            .setDocumentFilter(new NameValidator());
    frame.add(name);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            NameTest nt = new NameTest();

         }
      });
    }
 }

共有2个答案

仉联
2023-03-14

我找到的解决方案可能是修改以解决我上面提到的所有验证所必需的。我使用DocumentFilter来消除\p{Punct}-除了'来自此集合和[0-9]

这是我使用的代码:

public class NameValidator extends DocumentFilter{
@Override
public void insertString(FilterBypass fb, int off
                    , String str, AttributeSet attr) 
                            throws BadLocationException 
{
    // remove 0-9 !"#$%&()*+,-/:;<=>?@[\]^_`{|}~
    //back space character is skipped here!
    fb.insertString(off, str.replaceAll("^[0-9\\_\\(\\)@!\"#%&*+,\\-:;<>=?\\[\\]\\^\\~\\{\\}\\|\\/]", ""), attr);
} 
@Override
public void replace(FilterBypass fb, int off
        , int len, String str, AttributeSet attr) 
                        throws BadLocationException 
{
    // remove 0-9 !"#$%&()*+,-/:;<=>?@[\]^_`{|}~
    fb.replace(off, len, str.replaceAll("^[0-9\\_\\(\\)@!\"#%&*+,\\-:;<>=?\\[\\]\\^\\~\\{\\}\\|\\/]", ""), attr);
       }

  }

任何修改均可接受,以适应原问题中规定的验证。

柯波娃
2023-03-14

您可以将JFormattedTextFieldMaskFor质一起使用。MaskFor质允许您指定有效字符的String

MaskFormatter mf = new MaskFormatter( "***************" );
mf.setValidCharacters(" .abcABC");
JFormattedTextField ftf = new JFormattedTextField( mf );

在幕后,格式化文本字段使用DocumentFilter。阅读Swing教程中有关如何使用格式化文本字段的部分,了解更多信息和示例

您还可以尝试在论坛/网站上搜索regex DocumentFilter。这种类型的过滤器通常是可重用的,因为您只需要指定正则表达式。例如:在JTextField的DocumentFilter中使用regex时遇到问题

 类似资料:
  • 问题内容: 我想使用一个框并使用适配器功能进行过滤。直到我在文本框中输入空格后,它才能正常工作。 编辑:这是一个 SimpleAdapter不是ArrayAdapter 如果我的列表中包含以下单词:{“ Apple”,“ Banana”,“ Red Apple”}如果键入“ apple”,它将返回其中包含apple这个单词的所有项目(Apple和Red Apple)。如果我键入“ apple”,它

  • 我有一个不寻常的问题,有些东西工作得有点太好了。我已经写了一个开关,它只允许用户以数字的形式输入,在书写过程中在适当的位置添加破折号。在中可以看到这样的日期:“2016-05-01”。问题是并非总是由用户填写,有时必须由程序设置。但当我使用code setText(“2016-05-01”)时,它不能正确显示,所有的破折号都消失了。如何让它工作?我试图更改以允许dash,但这就是为什么在许多其他地

  • 如何防止用户在“JTextField”中输入某些字符,如果输入该字符,则不要在文本字段中显示它

  • 问题内容: 我在Stream中有Google Guava: 如您所见,过滤器函数内部有一条语句。 我不想在项目中再使用番石榴,所以我只想替换为: 我怎样才能使它更优雅? 问题答案: 您可以编写自己的谓词: 然后,将其用作您的过滤器参数。

  • 问题内容: 我正在研究AngularJS教程,并了解的基础知识 但是,开箱即用的实现似乎仅限于将项目列表过滤为输入的确切单词或短语。 示例:如果查询是“ table cloth”,则结果列表可以包含带有短语“ Decorative table cloth”的结果,但由于过滤器只是一个连续的搜索字符串,因此将不包括“ Table fortable装饰布”。 我知道可以添加自定义过滤器,但乍一看似乎主

  • 我试图将名称字段索引到elasticsearch中,名称可能是字符串或空字符串(),我希望搜索所有包含空值的名称,所以我使用筛选器,但对于筛选器,空值不是空值。 https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-exists-filter.html 查询DSL: 如何将空字符串作为elasticsearch筛