Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jTextField只接受字母和空格_Java_Swing_Filter_Jtextfield - Fatal编程技术网

Java jTextField只接受字母和空格

Java jTextField只接受字母和空格,java,swing,filter,jtextfield,Java,Swing,Filter,Jtextfield,我希望用户只输入字母或空格 若用户输入其他字符,我希望使用jOptionPane发送消息 我已经搜索并尝试了以下代码 if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE); 但现在无论我输入什么,它

我希望用户只输入字母或空格 若用户输入其他字符,我希望使用jOptionPane发送消息 我已经搜索并尝试了以下代码

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText())))
        JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
但现在无论我输入什么,它都会给出错误

现在我改变了密码

Pattern letterPattern = Pattern.compile("^[a-zA-Z]+$");

if (!(letterPattern.matcher(answerField1.getText()).matches()))
      {
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}
现在它只在用户输入数字的第一时间发出消息。
我如何解决这个问题呢?

第一行末尾有一个分号。因此,它并没有真正正确地进行测试

这样的陈述就是你所拥有的:

if (condition) ;
将执行空语句;如果条件为真,则转到下一行。如果条件为false,它将直接转到下一行。这两个动作具有相同的结果

您可以尝试在所有if语句上使用大括号。这有时是乏味的,但更难搞砸

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) {
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}
这就是我要做的。您可以删除分号。

使用DocumentFilter,下面是我制作的一个示例,它只接受字母字符和空格:

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Test {

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField jtf = new JTextField();
        //add filter to document
        ((AbstractDocument) jtf.getDocument()).setDocumentFilter(new MyDocumentFilter());

        frame.add(jtf);

        frame.pack();
        frame.setVisible(true);
    }
}

class MyDocumentFilter extends DocumentFilter {

    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        for (int n = string.length(); n > 0; n--) {//an inserted string may be more than a single character i.e a copy and paste of 'aaa123d', also we iterate from the back as super.XX implementation will put last insterted string first and so on thus 'aa123d' would be 'daa', but because we iterate from the back its 'aad' like we want
            char c = string.charAt(n - 1);//get a single character of the string
            System.out.println(c);
            if (Character.isAlphabetic(c) || c == ' ') {//if its an alphabetic character or white space
                super.replace(fb, i, i1, String.valueOf(c), as);//allow update to take place for the given character
            } else {//it was not an alphabetic character or white space
                System.out.println("Not allowed");
            }
        }
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);

    }
}

此代码可能会帮助您:

answerField1.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            char ch = e.getKeyChar();
            if(Character.isDigit(ch)){
                answerField1.setText("");
                JOptionPane.showMessageDialog(null, "Enter Alphabet Only !");
                                     }
                                            }
    });

看到这个答案:谢谢,但是所有关于数字的例子,有关于字母表的例子吗?因为我不明白如何将代码转换为AlphaBeta,你也可以使用JFormattedTextField哦,是的。正则表达式的方括号中没有空格,因此不允许有空格。这可能是复制问题,也可能不是。请尝试使用调试器单步执行。如果为文本值和匹配调用的结果生成一些局部变量,则更容易看到发生了什么。2在此处测试正则表达式,看看它是否按照您的想法工作。