如何确保 JTextField 只包含字母?

Posted

技术标签:

【中文标题】如何确保 JTextField 只包含字母?【英文标题】:How to make sure that JTextField contains only letters? 【发布时间】:2015-07-06 19:29:52 【问题描述】:

我只想在我的姓名字段中输入字母。

我已经尝试过使用matches方法,但不幸的是出了点问题,正在抛出异常。

有没有其他检查方法?

   import java.awt.BorderLayout;
   import java.awt.FlowLayout;
   import java.awt.GridBagConstraints;
   import java.awt.GridBagLayout;
   import java.awt.GridLayout;
   import java.awt.Insets;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import javax.swing.*;


    public class CreateAccount extends JFrame implements ActionListener

    JPanel details = new JPanel(new GridBagLayout());

    JLabel fName= new JLabel("First Name:");
    JTextField firstNameField = new JTextField(10);

    JLabel lName= new JLabel("Last Name:");
    JTextField lastNameField = new JTextField(10);

    JLabel initialDeposit = new JLabel("Initial Deposit: ");
    JTextField initialDepositField = new JTextField(10);

    String accountTypes[] = "Savings","Current";

    JComboBox accountTypesComboBox = new JComboBox(accountTypes);
    JLabel accountType= new JLabel("Account type: ");

    JButton submit = new JButton("SUBMIT");
    JButton review = new JButton("REVIEW");

    Administrator admin = new Administrator();
    User u[] = new User[admin.maxNumberOfUsers];

    CreateAccount() 
        buildGui();
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    public void initialiseUserCount() 
        admin.numberOfSavingsAccount = 0;
        admin.numberOfCurrentAccount = 0;
        admin.numberOfUsers=0;
    
    public void buildGui() 

        setTitle("New Account Form");

        //JPanel submitPanel = new JPanel();
        //submitPanel.add(submit);


        GridBagConstraints c = new GridBagConstraints();
        c.insets=new Insets(10,10,10,10);
        // Stretch components horizontally (but not vertically) 
        c.fill = GridBagConstraints.HORIZONTAL;
        // Components that are too short or narrow for their space
        // Should be pinned to the northwest (upper left) corner
        c.anchor = GridBagConstraints.NORTHWEST;
        // Give the "last" component as much space as possible
        c.weightx = 1.0;

        c.gridx=0;
        c.gridy=0;
        details.add(fName,c);
        c.gridx=1;
        c.gridy=0;
        details.add(firstNameField,c);
        c.gridx=0;
        c.gridy=1;
        details.add(lName,c);
        c.gridx=1;
        c.gridy=1;
        details.add(lastNameField,c);
        c.gridx=0;
        c.gridy=2;
        details.add(initialDeposit,c);
        c.gridx=1;
        c.gridy=2;
        details.add(initialDepositField,c);
        c.gridx=0;
        c.gridy=3;
        details.add(accountType,c);
        c.gridx=1;
        c.gridy=3;
        details.add(accountTypesComboBox,c);
        c.gridx=0;
        c.gridy=4;
        details.add(submit,c);
        c.gridx=1;
        c.gridy=4;
        details.add(review,c);
        add(details);

        firstNameField.addActionListener(this);
        review.addActionListener(this);

    
    public void actionPerformed(ActionEvent e) 
        if(e.getSource()==firstNameField) 
            try 
                String uFName = firstNameField.getText().toString();

                if(!uFName.matches("[A-Za-z]+"))
                    throw new Exception();
            
            catch(Exception e1) 
                firstNameField.setText("");
                JOptionPane.showMessageDialog(firstNameField,"Please enter a valid name!");
            
        
    

【问题讨论】:

请向我们展示堆栈跟踪 显示uFName的值。 不要使用异常来控制逻辑,使用if-else语句 堆栈跟踪为空。 @TheLostMind 它现在可以工作了。 @TheLostMind。看来我正在使用一个旧的摆动输出,其中我在正则表达式中没有+。生成新的需要一些时间。非常感谢。 【参考方案1】:

使用DocumentFilter。它将允许您对文本字段执行实时验证

请参阅Implementing a Document Filter 和DocumentFilter Examples 了解更多详情

例如...

public class CharFilter extends DocumentFilter 

    public void insertString(DocumentFilter.FilterBypass fb, int offset,
                    String string, AttributeSet attr)
                    throws BadLocationException 

        StringBuffer buffer = new StringBuffer(string);
        for (int i = buffer.length() - 1; i >= 0; i--) 
            char ch = buffer.charAt(i);
            if (!Character.isLetter(ch)) 
                buffer.deleteCharAt(i);
            
        
        super.insertString(fb, offset, buffer.toString(), attr);
    

    public void replace(DocumentFilter.FilterBypass fb,
                    int offset, int length, String string, AttributeSet attr) throws BadLocationException 
        if (length > 0) 
            fb.remove(offset, length);
        
        insertString(fb, offset, string, attr);
    

并使用类似...

JTextField firstNameField = new JTextField(20);
((AbstractDocument)firstNameField.getDocument()).setDocumentFilter(new CharFilter());

【讨论】:

【参考方案2】:

你可以试试这个正则表达式

if(!uFName.matches("^[a-zA-Z]+$"))

【讨论】:

matches() 不需要 ^ and $ 。默认情况下,它匹配整个字符串。 :) 它现在可以工作了。看来我使用的是旧的摆动输出,其中我在正则表达式中没有+。生成新的需要一些时间。非常感谢。 @RahulTripathi

以上是关于如何确保 JTextField 只包含字母?的主要内容,如果未能解决你的问题,请参考以下文章

如何只允许在 jTextField 中引入数字?

如何只允许在 Java 中的 JTextField 中浮动

将 JTextField 输入限制为整数 [重复]

将 JTextField 输入限制为整数 [重复]

java:限制swing中的JTextField只能输入中文,字母,数字。

限制 XSD 中的字符串,使它们没有前导或尾随空格,并且只包含字母数字、连字符和下划线?